Мне нужно сделать синхронизирующий вызов, чтобы иметь возможность обновить токен пользователя. Поэтому мне нужно использовать 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: я не могу использовать flatmap, так как мне нужно вернуть Response
not Observable<Response>