【问题标题】:OkHttpClient throws exception after upgrading to OkHttp3OkHttpClient 升级到 OkHttp3 后抛出异常
【发布时间】:2016-04-30 15:08:31
【问题描述】:

我正在使用以下代码行为使用 Retrofit2 发送的所有请求添加默认标头:

private static OkHttpClient defaultHttpClient = new OkHttpClient();
static {
    defaultHttpClient.networkInterceptors().add(new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request().newBuilder()
                    .addHeader("Accept", "Application/JSON").build();
            return chain.proceed(request);
        }
    });
}

将retrofit升级到beta-3版本后,我还必须将OkHttp升级到OkHttp3(实际上我只是将包名从okhttp更改为okhttp3,该库包含在retrofit中)。之后我从这一行得到例外:

defaultHttpClient.networkInterceptors().add(new Interceptor());

原因:java.lang.UnsupportedOperationException 在 java.util.Collections$UnmodifiableCollection.add(Collections.java:932)


原因:java.lang.ExceptionInInitializerError


这里有什么问题?

【问题讨论】:

    标签: android retrofit okhttp retrofit2 okhttp3


    【解决方案1】:

    如果你想创建 OkHttp(3)Client 对象,你必须使用 builder。

    尝试改变这个:

    private static OkHttpClient defaultHttpClient = new OkHttpClient();
    

    这样的:

      OkHttpClient defaultHttpClient = new OkHttpClient.Builder()
           .addInterceptor(
               new Interceptor() {
                 @Override
                 public Response intercept(Interceptor.Chain chain) throws IOException {
                       Request request = chain.request().newBuilder()
                       .addHeader("Accept", "Application/JSON").build();
                   return chain.proceed(request);
                  }
               }).build();
    

    【讨论】:

    • 是的。它工作正常。感谢完美的解决方案。
    • 您好,上面代码的实现说,...incompatible types: required : retrofit2.Response <> ; Found: okHttp3.Response ... ????
    • 这就是我的情况OkHttpClient defaultHttpClient = new OkHttpClient.Builder() .addInterceptor( new Interceptor() { @Override public okhttp3.Response intercept(Chain chain) throws IOException { Request request = chain.request().newBuilder() .addHeader("Accept", "Application/JSON") .addHeader("Cookie", s) .addHeader("Cache-Control", "max-age=25000").build(); return chain.proceed(request); } }).build();的工作方式...知道为什么吗?抱歉,我是 Retrofit lib 的新手...
    【解决方案2】:
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile "com.squareup.retrofit2:converter-gson:2.1.0"
    compile "com.squareup.retrofit2:adapter-rxjava:2.1.0"
    compile 'com.squareup.okhttp3:logging-interceptor:3.4.0'
    

    您可能应该使用这些版本。只需放置它们,同步您的 gradle,删除所有导入,然后重试。

    import okhttp3.Interceptor;
    
    import okhttp3.OkHttpClient;
    
    import okhttp3.Request;
    
    import okhttp3.Response;
    
    import okhttp3.logging.HttpLoggingInterceptor;
    
    import retrofit2.Retrofit;
    
    import retrofit2.converter.gson.GsonConverterFactory;
    

    【讨论】:

    • 这就是我要找的 :)
    猜你喜欢
    • 1970-01-01
    • 2016-10-31
    • 2020-11-21
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多