Почему я не могу отладить метод Proxy.newProxyInstance? - PullRequest
0 голосов
/ 26 сентября 2018

Я использую 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.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Поскольку сбои происходят с Android 8 и выше, я полагаю, что это связано с ограничениями этих версий в отношении приложений, работающих в фоновом режиме.

Полагаю, что из-за ваших усилий по отладке приложение слишком долго остается активным в фоновом режиме, в результате чего система в конечном итоге его убивает.

Однако в Logcat должно быть что-тотот.Возможно, вы увидите это, если удалите фильтры из окна Logcat.

0 голосов
/ 02 октября 2018

Теперь я хочу знать, как работает 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...