web-dev-qa-db-ja.com

レトロフィットロギングインターセプターの例外

Retrofitでログを有効にしようとしていますが、次の例外が発生します。

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)

そして、これは私がそれをしている方法です:

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

インターセプターを1つだけ追加しようとしましたが、それでもクラッシュします。私はこの依存関係を使用しています:

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'

私はここで何が間違っているのですか?

編集:これは恥ずかしいことです...問題は自然に解決しました。何も変更していません。すべてのコミットを修正していますが、RetrofitClientbuild.gradleの両方は変更されていません。したがって、この問題はgradleの依存関係やバージョンとは関係ありませんでした。

幸いなことに、誰かがこの例外に光を当てるでしょう!

21
josemigallas

Retrofit2.1.0はOkHttp3.3.0に依存しているため、Logging Interceptor(OkHttpの一部)に同じバージョンを使用します。

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

以下の依存関係を追加してみてください

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

進捗があれば教えてください

これを参照することもできます リンク

6
Soham

私の場合、この依存関係のペアが問題を解決しました。

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

とにかく、問題は依存関係の一貫性にあります...

1
Andrey

同じ問題に直面している場合、ランダムではないときにこの問題に直面している場合は、Android studio with Invalidate/Restartを試してください。将来のアップデートで修正される可能性があります。

1。以前のビルドをアンインストールします。
2。ファイル->無効化/キャッシュ->無効化して再起動します。

0
Rajesh Tiwari