为什么我不能调试Proxy.newProxyInstance方法?

时间:2018-09-26 02:06:31

标签: java android retrofit2

我正在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)行调试,但是崩溃了。我不知道为什么会崩溃。

编辑

我测试了几种设备。

  • Nexus 6P Android 8.0:调试时崩溃
  • 小米6 Android 8.1:调试时崩溃
  • OnePlus 3 Android 8.0:调试时崩溃
  • Nexus 6P Android 7.0:调试时效果很好
  • Oppo Android 6.0:调试时效果很好
  • 三星S4 Android 5.0:在调试时效果很好

在Android 8.0以上版本可能会崩溃。

2 个答案:

答案 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窗口中删除任何过滤器,也许会看到它。