我需要进行同步调用才能刷新用户令牌。因此,我需要使用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>