2016-01-24 44 views
22

Tôi đang sử dụng dòng mã sau đây để thêm một tiêu đề mặc định cho tất cả các yêu cầu của tôi được gửi bằng Retrofit2:OkHttpClient ném ngoại lệ sau khi nâng cấp lên 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); 
     } 
    }); 
} 

Sau khi nâng cấp trang bị thêm lên phiên bản beta 3, tôi đã có để nâng cấp OkHttp lên OkHttp3 (thực ra tôi chỉ đổi tên gói từ okhttp thành okhttp3, thư viện được bao gồm trong trang bị thêm). Sau đó tôi nhận được ngoại lệ từ dòng này:

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

Nguyên nhân: java.lang.UnsupportedOperationException tại java.util.Collections $ UnmodifiableCollection.add (Collections.java:932)


Nguyên nhân: java.lang.ExceptionInInitializerError


Sự cố ở đây là gì?

Trả lời

56

Bạn phải sử dụng trình tạo nếu bạn muốn tạo đối tượng khách hàng OkHttp (3).

Hãy thử thay đổi này:

private static OkHttpClient defaultHttpClient = new OkHttpClient(); 

Để một cái gì đó như thế này:

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 tuyệt vời! Cảm ơn! –

+0

Cảm ơn giải pháp rõ ràng – bheatcoker

+0

Có. nó hoạt động tốt. cảm ơn cho giải pháp hoàn hảo. –

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' 

Bạn có lẽ nên sử dụng các phiên bản. Chỉ cần đặt chúng, đồng bộ hóa gradle của bạn, xóa tất cả các lần nhập và thử lại.

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

đây là những gì tôi đang tìm :) – Bawa

Các vấn đề liên quan