2016-01-24 12 views
22

Używam następujące linie kodu, aby dodać domyślny nagłówek do wszystkich moich żądań wysyłanych za pomocą Retrofit2:OkHttpClient rzuca wyjątek po uaktualnieniu do 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); 
     } 
    }); 
} 

Po uaktualnieniu modernizację do wersji beta 3, miałem aby uaktualnić OkHttp do OkHttp3 również (faktycznie zmieniłem nazwy pakietów z okhttp na okhttp3, biblioteka jest zawarta w retroficie). Potem się wyjątki od tej linii:

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

Spowodowany przez: java.lang.UnsupportedOperationException na java.util.Collections $ UnmodifiableCollection.add (Collections.java:932)


Spowodowany przez: java.lang.ExceptionInInitializerError


Na czym polega problem?

Odpowiedz

56

Musisz użyć programu budującego, jeśli chcesz utworzyć obiekt klienta OkHttp (3).

zmiana Spróbuj tego:

private static OkHttpClient defaultHttpClient = new OkHttpClient(); 

Aby coś takiego:

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

OK świetnie! Dzięki! –

+0

Dzięki za przejrzyste rozwiązanie – bheatcoker

+0

Tak. to działa dobrze. dzięki za doskonałe rozwiązanie. –

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' 

Powinieneś raczej użyć tych wersji. Po prostu umieść je, zsynchronizuj swoją gradację, usuń wszystkie importowane dane i spróbuj ponownie.

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

tego właśnie szukałem :) – Bawa