Почему я не могу отладить метод Proxy.newProxyInstance?
Я использую 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
. После прочтения, я до сих пор не знаю его магии, тогда я решил отлаживать Ретрофта.
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 S4 Android 5.0: хорошо работает при отладке
Он может упасть выше Android 8.0.
Ответы
Ответ 1
Теперь я хочу знать, как работает 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"
Ответ 2
Поскольку сбои происходят с Android 8 и выше, я полагаю, что это связано с ограничениями этих версий в отношении приложений, работающих в фоновом режиме.
Я полагаю, что из-за ваших усилий по отладке приложение слишком активно работает в фоновом режиме, в результате система автоматически уничтожит его.
Однако в Logcat должно быть что-то. Возможно, вы видите это, если вы удалите какие-либо фильтры из окна Logcat.