2016-01-24 48 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