不支持的操作:Android,Retrofit,OkHttp。 在OkHttpClient中添加拦截器

我正在尝试通过Retrofit 2.0-beta3和Android中使用拦截器的OkHttpClient添加基于令牌的身份validation。 但是当我在OkHttpClient中添加拦截器时,我得到了UnsupportedOperationExceptionexception。 这里是我的代码:在ApiClient.java

public static TrequantApiInterface getClient(final String token) { if( sTreqantApiInterface == null) { Log.v(RETROFIT_LOG, "Creating api client for the first time"); OkHttpClient okClient = new OkHttpClient(); okClient.interceptors().add(new Interceptor() { @Override public Response intercept(Interceptor.Chain chain) throws IOException { Request original = chain.request(); // Request customization: add request headers Request.Builder requestBuilder = original.newBuilder() .header("Authorization", token) .method(original.method(), original.body()); Request request = requestBuilder.build(); return chain.proceed(request); } }); Retrofit client = new Retrofit.Builder() .baseUrl(baseUrl) .client(okClient) .addConverterFactory(GsonConverterFactory.create()) .build(); sTreqantApiInterface = client.create(TrequantApiInterface.class); } return sTreqantApiInterface; } 

我使用它就像:

 private void ampFreqTest(){ String token = getSharedPreferences(getString(R.string.preference_file_key), Context.MODE_PRIVATE) .getString(getString(R.string.key_token), ""); service = ApiClient.getClient(token); //I get an exception on this line: Call<List<AmpFreq>> call = service.getUserAmpFreq("1"); call.enqueue(new Callback<List<AmpFreq>>() { @Override public void onResponse(Response<List<AmpFreq>> response) { Toast.makeText(HomeScreen.this, "Got result", Toast.LENGTH_LONG); Log.v(ApiClient.RETROFIT_LOG, "Success api client." + response.message()); Log.v(ApiClient.RETROFIT_LOG, "Success api client."); } @Override public void onFailure(Throwable t) { Toast.makeText(HomeScreen.this, t.getMessage() , Toast.LENGTH_LONG); Log.v(ApiClient.RETROFIT_LOG, "Fail api client." + t.getMessage() ); } }); } 

但是我得到这个错误:

 Process: com.trequant.usman.trequant_android, PID: 14400 java.lang.UnsupportedOperationException at java.util.Collections$UnmodifiableCollection.add(Collections.java:932) at com.trequant.usman.trequant_android.api.ApiClient.getClient(ApiClient.java:41) 

它给我错误添加一个新的拦截器,说它不是可修改的但是拦截器()函数的文档说:/ **

  * Returns a modifiable list of interceptors that observe the full span of each call: from before * the connection is established (if any) until after the response source is selected (either the * origin server, cache, or both). */ 

我究竟做错了什么? 它可能是一个错误?

当您将Retrofit 2.0-beta2更改为Retrofit 2.0-beta3时,会发生此问题。 如果你想创buildOkHttpClient对象,你必须使用builder。

更改:

  OkHttpClient okClient = new OkHttpClient(); okClient.interceptors().add(new Interceptor() { @Override public Response intercept(Interceptor.Chain chain) throws IOException { Request original = chain.request(); // Request customization: add request headers Request.Builder requestBuilder = original.newBuilder() .header("Authorization", token) .method(original.method(), original.body()); Request request = requestBuilder.build(); return chain.proceed(request); } }); 

至 :

  OkHttpClient okClient = new OkHttpClient.Builder() .addInterceptor( new Interceptor() { @Override public Response intercept(Interceptor.Chain chain) throws IOException { Request original = chain.request(); // Request customization: add request headers Request.Builder requestBuilder = original.newBuilder() .header("Authorization", token) .method(original.method(), original.body()); Request request = requestBuilder.build(); return chain.proceed(request); } }) .build(); 

它应该解决你的问题。

如果其他答案不起作用,请尝试以下操作:

 OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(new MyInterceptor()) .build(); retrofit = new Retrofit.Builder() .baseUrl("http://google.com") .addConverterFactory(GsonConverterFactory.create()) .client(okHttpClient) .build();