解析sdk“java.lang.NoSuchMethodError”。 Okhttp图书馆之间的冲突

时间:2016-05-17 16:38:55

标签: android parse-platform nosuchmethoderror android-multidex

我在android studio中使用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.access$800(Parse.java:42)
at com.parse.Parse$1.call(Parse.java:410)
at com.parse.Parse$1.call(Parse.java:407)
at bolts.Task$4.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>

这是我的应用程序类:

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类的Parse.initialize语句中。因为当我调试我的应用程序并在该语句上设置断点(在该语句之前每件事情似乎都很好)当执行initialize语句时我的应用程序崩溃了。我搜索了很多,我没有找到解决这个问题的方法。请帮忙......

修改 好吧经过进一步的研究和玩gradle依赖,我发现这个错误不是因为multiDexEnabled而是因为Parse和google-maps-services使用的okhttp库之间存在冲突。 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,它们不再有效。

2 个答案:

答案 0 :(得分:1)

初始化Parse时将空字符串传递给客户端密钥。

$new_sales = Sale::with('AmountOrderRelation')->get();


@foreach ($new_sales as $sale)
                <tr>
                    <td class="table-text"><div>{{ $sale->id }}</div></td>

                    <td>
                        {{ $sale->AmountOrderRelation }}
                    </td>

                </tr>
            @endforeach

答案 1 :(得分:0)

尝试添加

app/Resources/translations/messages.<lang>.yml

到你的build.gradle文件。