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!
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'
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 .
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 ...
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.