解析 sdk "java.lang.NoSuchMethodError"。 Okhttp库之间的冲突
Parse sdk "java.lang.NoSuchMethodError". Conflict between Okhttp Libraries
我正在 android 工作室中使用 Parse SDK。在我的项目中启用 multidex 之前一切都很好,因为在添加地图库后我的项目超过了 64K 方法限制。当我 运行 我的应用程序时出现以下错误:
java.lang.NoSuchMethodError: com.squareup.okhttp.OkHttpClient.setFollowRedirects
at com.parse.ParseOkHttpClient.<init>(ParseOkHttpClient.java:58)
at com.parse.ParseHttpClient.createClient(ParseHttpClient.java:45)
at com.parse.ParsePlugins$Android.newHttpClient(ParsePlugins.java:175)
at com.parse.ParsePlugins.restClient(ParsePlugins.java:91)
at com.parse.Parse.getEventuallyQueue(Parse.java:615)
at com.parse.Parse.access0(Parse.java:42)
at com.parse.Parse.call(Parse.java:410)
at com.parse.Parse.call(Parse.java:407)
at bolts.Task.run(Task.java:357)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
这是我的 gradle 文件的样子:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
dexOptions {
javaMaxHeapSize "4g"
}
defaultConfig {
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.github.clans:fab:1.6.2'
compile 'com.google.android.gms:play-services:8.4.0'
compile 'com.google.maps:google-maps-services:0.1.9'
compile 'com.google.maps.android:android-maps-utils:0.4'
compile 'com.balysv:material-ripple:1.0.2'
compile 'com.android.support:cardview-v7:23.3.0'
compile 'com.android.support:recyclerview-v7:23.3.0'
compile 'com.android.support:design:23.3.0'
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.android.support:multidex:1.0.1'
compile('com.github.afollestad.material-dialogs:core:0.8.5.1@aar') {
transitive = true
}
compile 'com.parse.bolts:bolts-android:1.4.0'
compile 'com.parse:parse-android:1.13.0'
}
这是我的清单文件:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.rowburst.traverous.traverous">
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="23" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:name="com.example.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/MAPS_API_KEY" />
<activity
android:name="com.example.LaunchingActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.example.LoginActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar.FullScreen" />
<activity android:name="com.example.MainActivity"></activity>
</application>
这是我的申请 class:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Parse.initialize(new Parse.Configuration.Builder(this)
.applicationId(Const.APP_ID)
.server(Const.SERVER_URL)
.build());
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
我认为问题出在 MyApplication class 中的 Parse.initialize
语句中。因为当我调试我的应用程序并在该语句上设置断点时(在该语句之前一切似乎都很好)当执行初始化语句时我的应用程序崩溃了。我搜索了很多,但没有找到解决这个问题的方法。请帮忙...
编辑:
好的,经过进一步研究并尝试使用 gradle 依赖项后,我发现这个错误不是因为 multiDexEnabled,而是因为 Parse 使用的 okhttp 库和 google-maps-services 之间存在冲突。 Google-maps-services 使用 OkHttp:2.0.0,我猜 Parse 使用 OkHttp:2.4.0。我认为 OkHttp:2.0.0 没有这样的名称方法 setFollowRedirects
并且它覆盖了 OkHttp:2.4.0 这就是我的应用程序崩溃的原因。如果我删除 google-maps-services 编译语句我的应用程序工作正常。
注意:如果我这样做 compile com.squareup.okhttp:okhttp:2.4.0
错误不再出现,但我的解析函数(即登录和注册回调)给出此错误 com.parse.ParseException:java.lang.IllegalArgumentException: value == null
,它们不再工作。
尝试添加
compile 'com.squareup.okhttp:okhttp:2.4.0'
到您的 build.gradle 文件。
当您初始化 Parse 时,将空字符串传递给客户端密钥。
Parse.initialize(new Parse.Configuration.Builder(this)
.applicationId(Const.APP_ID)
.server(Const.SERVER_URL)
.clientKey("")
.build());
我正在 android 工作室中使用 Parse SDK。在我的项目中启用 multidex 之前一切都很好,因为在添加地图库后我的项目超过了 64K 方法限制。当我 运行 我的应用程序时出现以下错误:
java.lang.NoSuchMethodError: com.squareup.okhttp.OkHttpClient.setFollowRedirects
at com.parse.ParseOkHttpClient.<init>(ParseOkHttpClient.java:58)
at com.parse.ParseHttpClient.createClient(ParseHttpClient.java:45)
at com.parse.ParsePlugins$Android.newHttpClient(ParsePlugins.java:175)
at com.parse.ParsePlugins.restClient(ParsePlugins.java:91)
at com.parse.Parse.getEventuallyQueue(Parse.java:615)
at com.parse.Parse.access0(Parse.java:42)
at com.parse.Parse.call(Parse.java:410)
at com.parse.Parse.call(Parse.java:407)
at bolts.Task.run(Task.java:357)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
这是我的 gradle 文件的样子:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
dexOptions {
javaMaxHeapSize "4g"
}
defaultConfig {
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.github.clans:fab:1.6.2'
compile 'com.google.android.gms:play-services:8.4.0'
compile 'com.google.maps:google-maps-services:0.1.9'
compile 'com.google.maps.android:android-maps-utils:0.4'
compile 'com.balysv:material-ripple:1.0.2'
compile 'com.android.support:cardview-v7:23.3.0'
compile 'com.android.support:recyclerview-v7:23.3.0'
compile 'com.android.support:design:23.3.0'
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.android.support:multidex:1.0.1'
compile('com.github.afollestad.material-dialogs:core:0.8.5.1@aar') {
transitive = true
}
compile 'com.parse.bolts:bolts-android:1.4.0'
compile 'com.parse:parse-android:1.13.0'
}
这是我的清单文件:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.rowburst.traverous.traverous">
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="23" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:name="com.example.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/MAPS_API_KEY" />
<activity
android:name="com.example.LaunchingActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.example.LoginActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar.FullScreen" />
<activity android:name="com.example.MainActivity"></activity>
</application>
这是我的申请 class:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Parse.initialize(new Parse.Configuration.Builder(this)
.applicationId(Const.APP_ID)
.server(Const.SERVER_URL)
.build());
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
我认为问题出在 MyApplication class 中的 Parse.initialize
语句中。因为当我调试我的应用程序并在该语句上设置断点时(在该语句之前一切似乎都很好)当执行初始化语句时我的应用程序崩溃了。我搜索了很多,但没有找到解决这个问题的方法。请帮忙...
编辑:
好的,经过进一步研究并尝试使用 gradle 依赖项后,我发现这个错误不是因为 multiDexEnabled,而是因为 Parse 使用的 okhttp 库和 google-maps-services 之间存在冲突。 Google-maps-services 使用 OkHttp:2.0.0,我猜 Parse 使用 OkHttp:2.4.0。我认为 OkHttp:2.0.0 没有这样的名称方法 setFollowRedirects
并且它覆盖了 OkHttp:2.4.0 这就是我的应用程序崩溃的原因。如果我删除 google-maps-services 编译语句我的应用程序工作正常。
注意:如果我这样做 compile com.squareup.okhttp:okhttp:2.4.0
错误不再出现,但我的解析函数(即登录和注册回调)给出此错误 com.parse.ParseException:java.lang.IllegalArgumentException: value == null
,它们不再工作。
尝试添加
compile 'com.squareup.okhttp:okhttp:2.4.0'
到您的 build.gradle 文件。
当您初始化 Parse 时,将空字符串传递给客户端密钥。
Parse.initialize(new Parse.Configuration.Builder(this)
.applicationId(Const.APP_ID)
.server(Const.SERVER_URL)
.clientKey("")
.build());