2016-04-15 323 views
4

在我的项目中,我使用了OkHttp(版本2.5.0)作为我的网络请求库。但是前几天,我尝试将Retrofit2作为我的应用程序的网络请求库的一部分,正如您所知的那样,新的Retrofit2库对OkHttp(版本3.2.0)的依赖。因此,当我的应用在android下的是Android 5.0的版本总是会引起崩溃(放大版运作良好,并不会造成崩溃),崩溃堆栈信息显示如下:

04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err: java.lang.NoClassDefFoundError: okhttp3.OkHttpClient$Builder 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at com.comingx.athit.client.ServiceGenerator.<clinit>(ServiceGenerator.java:22) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at com.comingx.athit.ui.fragments.CircleNativeFragment.onViewCreated(CircleNativeFragment.java:105) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at android.os.Handler.handleCallback(Handler.java:808) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:103) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at android.os.Looper.loop(Looper.java:193) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5348) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at java.lang.reflect.Method.invokeNative(Native Method) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at java.lang.reflect.Method.invoke(Method.java:515) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at dalvik.system.NativeStart.main(Native Method) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err: java.lang.NoClassDefFoundError: okhttp3.OkHttpClient$Builder 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at com.comingx.athit.client.ServiceGenerator.<clinit>(ServiceGenerator.java:22) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at com.comingx.athit.ui.fragments.CircleNativeFragment.onViewCreated(CircleNativeFragment.java:105) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086) 
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252) 
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742) 
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617) 
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517) 
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:  at android.os.Handler.handleCallback(Handler.java:808) 
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:103) 
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:  at android.os.Looper.loop(Looper.java:193) 
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5348) 
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:  at java.lang.reflect.Method.invokeNative(Native Method) 
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:  at java.lang.reflect.Method.invoke(Method.java:515) 
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829) 
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645) 
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:  at dalvik.system.NativeStart.main(Native Method) 

从堆栈跟踪,我想这OkHttp(3.2.0版本)有一些与OkHttp(版本2.5.0)冲突。下面我会给我的外部库配置:

compile 'com.squareup.okhttp:okhttp:2.5.0' 
compile 'com.squareup.okhttp3:okhttp:3.2.0' 
compile 'com.google.code.gson:gson:2.6.2' 
compile 'com.squareup.retrofit2:retrofit:2.0.1' 
compile 'com.squareup.retrofit2:converter-gson:2.0.1' 

希望任何知道这个问题的人都能帮我一个忙!万分感谢!

更新1: 这是我ServiceGenerator.java

package com.comingx.athit.client; 

import com.comingx.athit.model.Constants; 
import com.comingx.athit.model.modelmanager.ModelManagerSingleton; 

import java.io.IOException; 

import okhttp3.Interceptor; 
import okhttp3.OkHttpClient; 
import okhttp3.Request; 
import okhttp3.Response; 
import retrofit2.Retrofit; 
import retrofit2.converter.gson.GsonConverterFactory; 

public class ServiceGenerator { 
    private static OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor(
      new Interceptor() { 
       @Override 
       public Response intercept(Chain chain) throws IOException { 
        Request request = chain.request() 
          .newBuilder().addHeader("Cookie", ModelManagerSingleton.getNative_cookie()).build(); 
        return chain.proceed(request); 
       } 
      } 
    ).build(); 
    private static Retrofit.Builder builder = 
      new Retrofit.Builder() 
        .baseUrl(Constants.V3.API_PREFIX) 
        .addConverterFactory(GsonConverterFactory.create()); 

    public static <T> T createService(Class<T> serviceClass) { 
     Retrofit retrofit = builder.client(httpClient).build(); 
     return retrofit.create(serviceClass); 
    } 
} 
+0

要贴上'com.comingx.athit.client.ServiceGenerator'的代码? – srain

+0

它看起来像OkHttp 3被设计为允许与早期的OkHttp搭配,如通过使用不同的包名称来判断。因此,我倾向于猜测:(1)实际上你的运行时类路径中没有OkHttp 3,或者(2)你的类路径中的OkHttp 3不完整,或者(3)'com.comingx.athit .client.ServiceGenerator',不管那是什么,都需要一个不同的版本,或许是更早的版本。 –

+0

我认为你可以删除2行'compile'c​​om.squareup.okhttp:okhttp:2.5.0' compile'c​​om.squareup.okhttp3:okhttp:3.2.0'' – BNK

回答

9

是的,我终于找到问题并解决它。我查看了类似问题here并发现可能会导致该问题,所以我来到official site 查看构建超过64K方法的应用程序。 现在你应该编译你的build.gradle文件中multidex库:

compile 'com.android.support:multidex:1.0.1' 

而且不要忘了你的配置defaultConfig:

android { 
    defaultConfig { 
    multiDexEnabled true 
    } 
} 

最后,你可以写一个BaseApplication延伸到应用程序,重写attachBaseContext(Context base)方法如下:

@Override 
    protected void attachBaseContext(Context base) { 
     super.attachBaseContext(base); 
     MultiDex.install(this); 
    } 

不要忘记添加到您的AndroidManifest.xml文件:

<application 
     android:name=".BaseApplication" 
     android:allowBackup="true"> 
</application> 
相关问题