2016-01-24 47 views
22

我使用的代码下面几行默认的标题添加到所有发送我的请求使用Retrofit2后抛出异常:OkHttpClient升级到OkHttp3

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

升级改造,以β-3版本后,我有也将OkHttp升级到OkHttp3(实际上,我只是将包名从okhttp更改为okhttp3,库包含在改进版中)。从那以后,我得到异常从这条线:在java.util.Collections中的$ UnmodifiableCollection.add(Collections.java:932)


java.lang.UnsupportedOperationException :

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

引起

产生的原因:java.lang.ExceptionInInitializerError


这里有什么问题?

回答

56

如果要创建OkHttp(3)客户端对象,则必须使用构建器。

尝试改变这一点:

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(); 
+0

好极了!谢谢! –

+0

感谢您的明确解决方案 – bheatcoker

+0

是的。它工作正常。感谢完美的解决方案。 –

1
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; 
+0

这就是我一直在寻找:) – Bawa