我正在通过HttpLogInterceptor
实现打印日志。但是发生了错误。
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);
}
答案 0 :(得分:2)
确保您的 okHttp 和 logging-interceptor 在build.gradle中具有相同的版本
像
<强> com.squareup.okhttp3:okhttp:3.4.1 强>
和
<强> com.squareup.okhttp3:测井拦截:3.4.1 强>
这里的版本相同 3.4.1 。
答案 1 :(得分:0)
我的Logger界面实现:
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);
}
};
}
答案 2 :(得分:0)
确保您的okHttp和logging-interceptor在build.gradle中具有相同的版本。另外,不要忘记添加compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
这将帮助您摆脱异常
Static interface methods are only supported starting with Android N (--min-api 24): void okhttp3.logging.HttpLoggingInterceptor$Logger.lambda$static$0(java.lang.String)