【问题标题】:Retrofit Request Interceptor blocks the main threadRetrofit Request Interceptor 阻塞主线程
【发布时间】:2015-03-17 06:33:01
【问题描述】:

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

Retrofit API 调用的请求拦截器在主线程上执行。这是与 AccountManager 打交道以将身份验证令牌添加到请求标头时的问题,例如

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

G+ 上讨论了同样的问题,GitHub 上here 上也有一个相关问题。

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

【问题讨论】:

  • Retrofit 的工作不是将网络调用移出主线程。它只是为 Rest 服务提供一个接口。我最近在一个项目中使用了this 方法,为使用 Retrofit 进行的每个调用添加了一个请求拦截器。

标签: android retrofit networkonmainthread


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多