此问题已被提及here,但这是一个相当古老的问题,我找不到任何其他信息。
Retrofit API调用的Request Interceptor在主线程上执行。处理AccountManager以将auth令牌添加到请求标头(例如
)时,这是一个问题String token = mAccountManager.blockingGetAuthToken(account, AuthConsts.AUTH_TYPE, false);
G+讨论了同样的问题,GitHub here也存在相关问题。
虽然这一切都有效(感谢SquareUp!),解决它的最佳方法是什么?在AsyncTask或类似事件中包装Retrofit调用感觉就像使整个想法失效一样。
答案 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
时才需要“刷新”令牌,然后您可以让请求失败或异步获取新令牌