如何在同步上下文中不使用toBlocking()?

时间:2019-01-04 23:14:05

标签: kotlin rx-java interceptor okhttp3

我需要进行同步调用才能刷新用户令牌。因此,我需要使用toBlocking()来等待我使用rxjava做出的响应。问题在于,这会导致死锁,因为我可以同时运行多个拦截器,并且它们中的任何一个都可以调用toBlocking()。

是否有一种无需使用toBlocking()即可进行同步调用的方法? 我该如何调试这种死锁?

我尝试过并导致问题的原因

@Throws(IOException::class)
  override fun intercept(chain: Interceptor.Chain): Response {
    val original = chain.request()
    val headerParams = chooseHeaderParams()
    val requestBuilder = original.newBuilder().method(original.method(), original.body()).addHeader(headerParams.first, headerParams.second)
    var response = chain.proceed(requestBuilder.build())

    if (response.isApolloAuthError()) { // any 401, error 500 with status code in { 1, 2 or 3 }
      synchronized(this) {
           signInGraphQlSync() 
      }

        // Add new header to rejected request and retry it
        requestBuilder.header(HEADER_KEY_APOLLO_AUTHORIZATION, getApolloToken())
        response = chain.proceed(requestBuilder.build())
      }
    }

    return response
  }


// Sign in and update my token sync
    fun signInGraphQlSync() {
       repository.signInGraphQL().toBlocking().first()
    }

PS:我无法使用平面地图,因为我需要返回Response而不是Observable<Response>

0 个答案:

没有答案