web-dev-qa-db-fra.com

Exception d'intercepteur de journalisation en rattrapage

J'essaie d'activer la journalisation avec Retrofit, mais j'obtiens cette exception:

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)

Et voici comment je le fais:

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();
    }
}

J'ai essayé d'ajouter un seul intercepteur mais je me suis toujours effondré. J'utilise ces dépendances:

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'

Qu'est-ce que je fais mal ici?

EDIT: Eh bien, c'est embarrassant ... le problème s'est résolu lui-même. Je n'ai rien changé, je révise tous mes commits et RetrofitClient et build.gradle n'ont pas changé. Le problème n'était donc pas lié aux dépendances ni aux versions de gradle.

Heureusement, quelqu'un fera la lumière sur cette exception!

21
josemigallas

Retrofit 2.1.0 s'appuie sur OkHttp 3.3.0, j'utiliserais donc la même version pour le logging Interceptor (qui fait partie d'OkHttp):

compile 'com.squareup.okhttp3:logging-interceptor:3.3.0'
38
Jorge Pastor

Pouvez-vous essayer d'ajouter la dépendance ci-dessous 

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

Et laissez-moi savoir s'il y a des progrès

Vous pouvez également vous référer à ce link .

6
Soham

Dans mon cas, cette paire de dépendances a résolu le problème:

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

Quoi qu'il en soit, le problème réside dans la cohérence des dépendances ...

1
Andrey

Face au même problème, si vous ne le rencontrez pas toujours au hasard, essayez de redémarrer Android Studio avec Invalidate/Restart. Peut-être que cela sera corrigé dans les futures mises à jour.

1. Désinstallez la version précédente.
2. Fichier-> Invalider/Cache -> Invalider et redémarrer.

0
Rajesh Tiwari