Я использую Retrofit на Android.
Я определяю сервис 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)
, но она вылетает.Я не знаю, почему он падает.
РЕДАКТИРОВАТЬ
Я протестировал несколько устройств.
- Nexus 6P Android 8.0: сбой при отладке
- Xiaomi 6 Android 8.1: сбой при отладке
- OnePlus 3 Android 8.0: сбой при отладке
- Nexus 6P Android 7.0: хорошо работает при отладке
- Oppo Android 6.0: хорошо работает при отладке
- Samsung S4Android 5.0: хорошо работает при отладке
Может зависать выше Android 8.0.