我正在Android上使用Retrofit。
我定义了服务GitHubService
。
public interface GithubService {
@GET("users/{user}")
Call<ResponseBody> fetchUserInfo(@Path("user") String user);
}
然后我创建服务。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.github.com")
.build();
GithubService service = retrofit.create(GithubService.class);
Call<ResponseBody> call = service.fetchUserInfo("coxier");
call.enqueue(...);
如您所见,我使用上述代码来获取github的用户信息。以上代码对我来说效果很好。现在,我想知道Retofit的工作原理,因此我阅读了源代码。下面的代码是Retrofit#create
。看完后,我仍然不知道它的魔力,于是我决定调试Retroft。
public <T> T create(final Class<T> service) {
...
return (T) Proxy.newProxyInstance(...,
new InvocationHandler() {
...
@Override public Object invoke(..)
throws Throwable {
if (method.getDeclaringClass() == Object.class) {
return method.invoke(this, args);
}
...
return loadServiceMethod(method).invoke(args != null ? args : emptyArgs);
}
});
}
我在if(method.getDeclaringClass() == Object.class)
行调试,但是崩溃了。我不知道为什么会崩溃。
我测试了几种设备。
在Android 8.0以上版本可能会崩溃。
答案 0 :(得分:3)
现在我想知道Retofit的工作原理,因此我阅读了源代码。
这是您要实现的目标吗?通过添加拦截器,您将能够在logcat中看到请求。
private RestApiStack() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
// preview requests
if (BuildConfig.DEBUG) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(interceptor);
}
OkHttpClient client = builder.build();
Retrofit retrofit = (new Retrofit.Builder())
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(/*...*/)
.build();
api = retrofit.create(ApiStack.class);
}
依赖项:
implementation "com.squareup.okhttp3:logging-interceptor:3.9.1"
implementation "com.squareup.okhttp3:okhttp:3.11.0"
答案 1 :(得分:3)
由于崩溃是在Android 8及更高版本上发生的,因此我认为这与该版本在后台运行的应用程序的限制有关。
我想,由于您的调试工作,该应用在后台处于活动状态的时间过长,导致系统最终将其杀死。
但是,Logcat中应该有关于此的内容。如果从Logcat窗口中删除任何过滤器,也许会看到它。