【问题标题】:Why I can not debug Proxy.newProxyInstance method?为什么我不能调试 Proxy.newProxyInstance 方法?
【发布时间】:2018-09-26 02:06:30
【问题描述】:

我在 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:调试时运行良好
  • Samsung S4 Android 5.0:调试时运行良好

Android 8.0 以上可能会崩溃。

【问题讨论】:

  • 你能提供Logcat吗?
  • @JeelVankhede 没有崩溃日志。

标签: java android retrofit2


【解决方案1】:

由于崩溃发生在 Android 8 及更高版本上,我想这与该版本对后台运行的应用程序的限制有关。

我想,由于您的调试工作,该应用程序在后台保持活动的时间过长,导致系统最终将其杀死。

但是,Logcat 中应该有一些关于此的内容。如果您从 Logcat 窗口中删除任何过滤器,也许您会看到它。

【讨论】:

  • 你可以试试上面的代码,很简单。实际上我没有找到任何日志。
【解决方案2】:

现在我想知道 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"

【讨论】:

  • 我只是想调试改造并知道它是如何工作的。
  • 密钥是interceptor,按照我给你看的方法使用。当您运行您的应用程序时,请尝试在 logcat 控制台中写入 okhttp
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 2013-07-09
  • 2014-11-24
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
相关资源
最近更新 更多