Retrofit请求拦截器阻塞了主线程。

7
这个问题在这里已经被提到过了(链接),但是那是一个相当古老的问题,我找不到其他信息。
Retrofit API调用的请求拦截器在主线程上执行。当使用AccountManager向请求头添加身份验证令牌时,这是一个问题。
String token = mAccountManager.blockingGetAuthToken(account, AuthConsts.AUTH_TYPE, false);

同样的问题在 G+ 上讨论过,并且在 GitHub 上有一个相关的问题,这里

在所有这些问题得到解决之前(感谢SquareUp!),最好的方法是什么?在AsyncTask或类似的东西中包装Retrofit调用感觉像是无效的想法。


1
Retrofit的工作并不是将网络调用移出主线程,而仅仅是提供一个与Rest服务交互的接口。我最近在一个项目中使用了这种方法,通过添加请求拦截器来处理Retrofit发起的每个调用。此链接提供了具体实现。 - Philippe A
2个回答

18

Retrofit的拦截器用于利用已知信息修改请求。也就是说,它应该是一个简单实例的转换。

对于您所寻找的最佳方法是使用OkHttp的拦截器来添加标头。这些将在后台线程上运行。

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);
  }
}

1
你可以简单地使用peekAuthToken来获取令牌,只有在结果为null时才需要“刷新”令牌,然后你可以让请求失败或异步获取新令牌。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接