【问题标题】:Retrofit logging interceptor exception改造日志拦截器异常
【发布时间】:2016-11-15 22:16:03
【问题描述】:

我正在尝试使用 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();
    }
}

我尝试只添加一个拦截器,但仍然崩溃。我正在使用这个依赖项:

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 依赖项或版本无关。

幸运的是,有人会对此例外有所了解!

【问题讨论】:

    标签: android retrofit2


    【解决方案1】:

    Retrofit 2.1.0 依赖于 OkHttp 3.3.0,所以我会为 Logging Interceptor(它是 OkHttp 的一部分)使用相同的版本:

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

    【讨论】:

      【解决方案2】:

      你可以尝试添加以下依赖项

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

      如果有任何进展,请告诉我

      您也可以参考这个link

      【讨论】:

        【解决方案3】:

        在我的例子中,这对依赖解决了这个问题:

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

        无论如何,问题在于依赖一致性......

        【讨论】:

          【解决方案4】:

          面对同样的问题,如果您有时不是随机遇到此问题,请尝试使用 Invalidate/Restart 重新启动 android studio。也许它会在未来的更新中得到修复。

          1.卸载以前的版本。
          2.文件->无效/缓存->无效和 重新启动。

          【讨论】:

          • Rajesh,这在理论上如何帮助解决问题?你能解释一下吗?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-13
          相关资源
          最近更新 更多