Retrofit Request Interceptor 阻塞主线程

Retrofit Request Interceptor blocks the main thread

这个问题已经提到了here,但这是一个很老的问题,我找不到任何其他信息。

Retrofit API调用的请求拦截器在主线程上执行。这是处理 AccountManager 以向请求添加身份验证令牌时的问题 header,例如

String token = mAccountManager.blockingGetAuthToken(account, AuthConsts.AUTH_TYPE, false);

G+ and there is a related issue on GitHub here 上讨论了相同的问题。

虽然这一切都奏效了(感谢 SquareUp!),但最好的解决方法是什么?将 Retrofit 调用包装在 AsyncTask 或类似的东西中感觉就像使整个想法无效。

您可以简单地使用 peekAuthToken 来获取令牌,只有当结果是 null 时,您才需要 "refresh" 令牌,然后您可以让请求失败或异步获取新令牌

Retrofit 的拦截器用于修改已知信息的请求。也就是说应该是简单的实例化改造。

您要查找的内容的最佳方法是使用 OkHttp's interceptors 添加 header。这些将 运行 在后台线程上。

class AuthInterceptor implements Interceptor {
  @Override public Response intercept(Chain chain) throws IOException {
    Request request = chain.request();

    String authHeader = // TODO get auth token
    request = request.builder()
      .header("Authorization", authHeader)
      .builder();

    return chain.proceed(request);
  }
}