2016-07-13 37 views
21

Sto cercando di attivare la registrazione con Retrofit ma sto ottenendo questa eccezione:Retrofit eccezione registrazione intercettore

07-13 12:44:53.278 28698-29248/com.xxxx.debug E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher 
                         Process: com.xxxx.debug, PID: 28698 
                         java.lang.NoSuchMethodError: No virtual method log(Ljava/lang/String;)V in class Lokhttp3/internal/Platform; or its super classes (declaration of 'okhttp3.internal.Platform' appears in /data/data/com.xxxx.debug/files/instant-run/dex/slice-realm-optional-api_16b022358933b490d810e358ea76b13cd4d88163-classes.dex) 
                          at okhttp3.logging.HttpLoggingInterceptor$Logger$1.log(HttpLoggingInterceptor.java:109) 
                          at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:157) 
                          at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:190) 
                          at com.xxxx.api.RetrofitClient$1.intercept(RetrofitClient.java:59) 
                          at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:190) 
                          at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:163) 
                          at okhttp3.RealCall.access$100(RealCall.java:30) 
                          at okhttp3.RealCall$AsyncCall.execute(RealCall.java:127) 
                          at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 
                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                          at java.lang.Thread.run(Thread.java:818) 

E questo è come lo faccio:

public class RetrofitClient { 

    private static MyService instance; 

    public static MyService getInstance(Context context) { 
     if (instance == null) { 
      instance = newInstance(context); 
     } 
     return instance; 
    } 

    private static MyService newInstance(Context context) { 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(context.getString(R.string.base_url)) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .client(getClient()) 
       .build(); 

     return retrofit.create(MyService.class); 
    } 

    @NonNull 
    private static OkHttpClient getClient() { 
     HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor() 
       .setLevel(HttpLoggingInterceptor.Level.BODY); 

     OkHttpClient.Builder httpClient = new OkHttpClient.Builder() 
       .addInterceptor(new Interceptor() { 
        @Override 
        public Response intercept(Chain chain) throws IOException { 
         Request original = chain.request(); 

         Request request = original.newBuilder() 
           .header("api-key", "...") 
           .header("version-app", "-") 
           .header("platform", "android") 
           .header("version", "-") 
           .header("device", "-") 
           .method(original.method(), original.body()) 
           .build(); 

         Response response = chain.proceed(request);// <-- CRASH 

         return response; 
        } 
       }) 
       .addInterceptor(interceptor); 

     return httpClient.build(); 
    } 
} 

Ho provato ad aggiungere solo un intercettore ma continua a schiantarsi. Sto usando queste dipendenze:

compile 'com.squareup.retrofit2:retrofit:2.1.0' 
compile 'com.squareup.retrofit2:converter-gson:2.1.0' 
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1' 

Cosa sto facendo di sbagliato qui?

MODIFICA: Beh, questo è imbarazzante ... il problema è risolto da solo. Non ho cambiato nulla, sto rivedendo tutti i miei commit ed entrambi RetrofitClient e build.gradle non sono stati modificati. Il problema, quindi, non era correlato alle dipendenze o alle versioni gradle.

Fortunatamente qualcuno farà luce su questa eccezione!

risposta

6

Puoi provare ad aggiungere la dipendenza sotto

compile 'com.squareup.okhttp3:okhttp:3.4.1' 

e fatemi sapere se c'è qualche progresso

È inoltre possibile consultare questo link.

38

Retrofit 2.1.0 si basa su OkHttp 3.3.0, quindi vorrei usare la stessa versione per l'Interceptor registrazione (che fa parte del OkHttp):

compile 'com.squareup.okhttp3:logging-interceptor:3.3.0' 
1

Nel mio caso questo paio di dipendenze risolto il problema:

compile 'com.squareup.retrofit2:retrofit:2.1.0' 
compile 'com.squareup.okhttp3:logging-interceptor:3.3.1' 

in ogni caso, il problema è nella consistenza dipendenza ...