2016-07-13 31 views
21

Tôi cố gắng để kích hoạt tính năng đăng nhập với Retrofit nhưng tôi nhận được ngoại lệ này:Retrofit khai thác gỗ chặn ngoại lệ

07-13 12:44:53.278 28698-29248/com.xxxx.debug E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher 
                         Process: com.xxxx.debug, PID: 28698 
                         java.lang.NoSuchMethodError: No virtual method log(Ljava/lang/String;)V in class Lokhttp3/internal/Platform; or its super classes (declaration of 'okhttp3.internal.Platform' appears in /data/data/com.xxxx.debug/files/instant-run/dex/slice-realm-optional-api_16b022358933b490d810e358ea76b13cd4d88163-classes.dex) 
                          at okhttp3.logging.HttpLoggingInterceptor$Logger$1.log(HttpLoggingInterceptor.java:109) 
                          at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:157) 
                          at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:190) 
                          at com.xxxx.api.RetrofitClient$1.intercept(RetrofitClient.java:59) 
                          at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:190) 
                          at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:163) 
                          at okhttp3.RealCall.access$100(RealCall.java:30) 
                          at okhttp3.RealCall$AsyncCall.execute(RealCall.java:127) 
                          at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 
                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                          at java.lang.Thread.run(Thread.java:818) 

Và đây là cách tôi đang làm nó:

public class RetrofitClient { 

    private static MyService instance; 

    public static MyService getInstance(Context context) { 
     if (instance == null) { 
      instance = newInstance(context); 
     } 
     return instance; 
    } 

    private static MyService newInstance(Context context) { 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(context.getString(R.string.base_url)) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .client(getClient()) 
       .build(); 

     return retrofit.create(MyService.class); 
    } 

    @NonNull 
    private static OkHttpClient getClient() { 
     HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor() 
       .setLevel(HttpLoggingInterceptor.Level.BODY); 

     OkHttpClient.Builder httpClient = new OkHttpClient.Builder() 
       .addInterceptor(new Interceptor() { 
        @Override 
        public Response intercept(Chain chain) throws IOException { 
         Request original = chain.request(); 

         Request request = original.newBuilder() 
           .header("api-key", "...") 
           .header("version-app", "-") 
           .header("platform", "android") 
           .header("version", "-") 
           .header("device", "-") 
           .method(original.method(), original.body()) 
           .build(); 

         Response response = chain.proceed(request);// <-- CRASH 

         return response; 
        } 
       }) 
       .addInterceptor(interceptor); 

     return httpClient.build(); 
    } 
} 

Tôi đã cố gắng chỉ thêm một máy bay đánh chặn nhưng vẫn bị rơi. Tôi đang sử dụng phụ thuộc này:

compile 'com.squareup.retrofit2:retrofit:2.1.0' 
compile 'com.squareup.retrofit2:converter-gson:2.1.0' 
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1' 

Tôi đang làm gì sai ở đây?

CHỈNH SỬA: Điều này thật đáng xấu hổ ... sự cố đã được giải quyết. Tôi không thay đổi gì cả, tôi đang sửa đổi tất cả các cam kết của mình và cả hai RetrofitClientbuild.gradle chưa thay đổi. Vấn đề, do đó, không liên quan đến phụ thuộc gradle hoặc các phiên bản.

May mắn thay, một người nào đó sẽ đưa ra một số ánh sáng về ngoại lệ này!

Trả lời

6

Bạn có thể cố gắng thêm sự phụ thuộc dưới

compile 'com.squareup.okhttp3:okhttp:3.4.1' 

Và cho tôi biết nếu có bất kỳ sự tiến bộ

Bạn cũng có thể tham khảo link này.

38

Retrofit 2.1.0 dựa trên OkHttp 3.3.0, vì vậy tôi sẽ sử dụng phiên bản tương tự cho các Interceptor Logging (đó là một phần của OkHttp):

compile 'com.squareup.okhttp3:logging-interceptor:3.3.0' 
1

Trong trường hợp của tôi cặp này phụ thuộc giải quyết vấn đề:

compile 'com.squareup.retrofit2:retrofit:2.1.0' 
compile 'com.squareup.okhttp3:logging-interceptor:3.3.1' 

Dù sao, vấn đề là ở tính thống nhất phụ thuộc ...

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