2016-10-04 92 views
2

我正在通過HttpLogInterceptor實現打印日誌。但是發生了一個錯誤。翻新httpLogInterceptor java.lang.NoSuchMethodError:

10-04 05:22:55.753 21294-21851/com.tc.retorfit_okhttp_cache_technique E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher 
Process: com.tc.retorfit_okhttp_cache_technique, PID: 21294 
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.tc.retorfit_okhttp_cache_technique/files/instant-run/dex/slice-okhttp-3.3.0_b69c4d16ac6ddca06e0d47d36f15c48706942fa9-classes.dex) 
at okhttp3.logging.HttpLoggingInterceptor$Logger$1.log(HttpLoggingInterceptor.java:109) 
at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:157) 
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) 
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) 
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:170) 
at okhttp3.RealCall.access$100(RealCall.java:33) 
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:120) 
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
at java.lang.Thread.run(Thread.java:761) 
at okhttp3.logging.HttpLoggingInterceptor$Logger$1.log(HttpLoggingInterceptor.java:109) 

的錯誤是在下面的代碼:

public interface Logger { 
    void log(String message); 

    /** A {@link Logger} defaults output appropriate for the current platform. */ 
    Logger DEFAULT = new Logger() { 
     @Override public void log(String message) { 
     Platform.get().log(message);//Here have a error,NoSuchMethodError 
     } 
    }; 
    } 

我的代碼是INT下面的代碼。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_print_log); 
    HttpLoggingInterceptor httpLoggingInterceptor=new HttpLoggingInterceptor();//compile 'com.squareup.okhttp3:logging-interceptor:3.1.2' 
    httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
    OkHttpClient okHttpClient=new OkHttpClient.Builder() 
      .addInterceptor(httpLoggingInterceptor) 
      .build(); 

    Retrofit retrofit = new Retrofit.Builder() 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .baseUrl("https://api.github.com/") 
      .client(okHttpClient) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 
    final PrintLogActivity.GitHubApi repo=retrofit.create(PrintLogActivity.GitHubApi.class); 
      Call<List<Contributor>> responseBodyCall = repo.getContributors("square","retrofit"); 
      responseBodyCall.enqueue(new Callback<List<Contributor>>() { 
       @Override 
       public void onResponse(Call<List<Contributor>> call, Response<List<Contributor>> response) { 
        Gson gson=new Gson(); 
        if (response.body()!=null&&response.body().size()>0){ 
         for (Contributor contributor:response.body()){ 

          Log.i("contributor",contributor.getLogin()); 
         } 
        }else{ 
         Log.i("contributor","list is null"); 
        } 
       } 

       @Override 
       public void onFailure(Call<List<Contributor>> call, Throwable t) { 
        Log.e("contributor","reuquire fail"); 
       } 
      }); 
      responseBodyCall.cancel(); 

} 
interface GitHubApi{ 

    @GET("repos/{owner}/{repo}/contributors") 
    Call<ResponseBody> contributorsBySimpleGetCall(@Path("owner") String own, @Path("repo") String repo); 

    @GET("users/{user}") 
    Call<ResponseBody> getUser(@Path("user") String user); 

    @GET("repos/{owner}/{repo}/contributors") 
    Call<List<Contributor>> getContributors(@Path("owner") String own,@Path("repo") String repo); 
} 

回答

2

確保您okHttp記錄攔截擁有的build.gradle相同版本

com.squareup.okhttp3:okhttp:3.4.1

and

com.squareup.okhttp3:日誌記錄攔截:3.4.1

這裏的版本是相同的3.4.1

+0

謝謝你,我的編譯版本是不同的。 –

0

我的記錄器接口的實現:

public interface Logger { 
    void log(String message); 

    /** A {@link Logger} defaults output appropriate for the current platform. */ 
    Logger DEFAULT = new Logger() { 
     @Override public void log(String message) { 
     Platform.get().log(Platform.WARN,message,null); 
     } 
    }; 
    }