2016-04-15 11 views
4

In meinem Projekt habe ich OkHttp (Version 2.5.0) als meine Netzwerkanforderungsbibliothek verwendet. Aber vor ein paar Tagen habe ich versucht, Retrofit2 als Teil der Netzwerk-Anfrage-Bibliothek meiner App, wie Sie wissen, die neue Retrofit2-Bibliothek Abhängigkeit von OkHttp (Version 3.2.0) .So kommt hier das Problem, wenn meine App auf Android-Handy läuft, deren Android Version unter android 5.0 immer führt zum Absturz (größere Version funktioniert gut und verursacht keinen Absturz), die Crash-Stack-Informationen zeigen, wie unten:

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) 

Von dem Stack-Trace, ich denke, dass OkHttp (Version 3.2.0) hat einig Konflikte mit OkHttp (Version 2.5.0). Im Folgenden werde ich meine externe Bibliothekskonfiguration geben:

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' 

Hoffnung jemand, der das Problem kennt, kann mir einen Gefallen! Vielen Dank!

Update 1: Hier ist meine 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

können den Code in 'com.comingx.athit.client.ServiceGenerator' einfügen? – srain

+0

Es sieht so aus, als ob OkHttp 3 Kollokation mit früherem OKHttp erlaubt, wie es durch die Verwendung eines anderen Paketnamens beurteilt wird. Ich neige daher zu der Annahme, dass entweder (1) Sie OkHttp 3 nicht in Ihrem Laufzeitklassenpfad haben, oder (2) das OkHttp 3 in Ihrem Klassenpfad unvollständig ist, oder (3) 'com.comingx.athit .client.ServiceGenerator', was auch immer das ist, möchte eine andere, vielleicht frühere Version. –

+0

Ich denke, Sie können 2 Zeilen entfernen "kompilieren" com.squadeup.okhttp: okhttp: 2.5.0 ' kompilieren' com.squareup.okhttp3: okhttp: 3.2.0'' – BNK

Antwort

9

Ja, schließlich finde ich das Problem und es zu lösen. Ich sah ein ähnliches Problem here und feststellen, dass vielleicht die 64K Methoden könnte das Problem verursachen, so kam ich zu official site Gebäuden Apps mit Over 64K Methoden anzuzeigen. Jetzt sollten Sie die multidex Bibliothek in Ihrer build.gradle Datei kompilieren:

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

Und vergessen Sie nicht Ihre DefaultConfig config:

android { 
    defaultConfig { 
    multiDexEnabled true 
    } 
} 

Und schließlich können Sie eine BaseApplication erstreckt schreiben Anwendung, schreiben über die attachBaseContext (Context Base) Verfahren wie folgt:

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

Vergessen Sie nicht, dies zu AndroidManifest.xml Datei hinzuzufügen:

<application 
     android:name=".BaseApplication" 
     android:allowBackup="true"> 
</application>