Retrofit Request Interceptor阻止主线程

时间:2015-01-19 09:33:11

标签: android retrofit networkonmainthread

此问题已被提及here,但这是一个相当古老的问题,我找不到任何其他信息。

Retrofit API调用的Request Interceptor在主线程上执行。处理AccountManager以将auth令牌添加到请求标头(例如

)时,这是一个问题
String token = mAccountManager.blockingGetAuthToken(account, AuthConsts.AUTH_TYPE, false);

G+讨论了同样的问题,GitHub here也存在相关问题。

虽然这一切都有效(感谢SquareUp!),解决它的最佳方法是什么?在AsyncTask或类似事件中包装Retrofit调用感觉就像使整个想法失效一样。

2 个答案:

答案 0 :(得分:11)

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

您正在寻找的最佳方法是使用OkHttp's interceptors添加标头。这些将在后台线程上运行。

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 :(得分:1)

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