Как не использовать toBlocking () в синхронном контексте? - PullRequest
0 голосов
/ 05 января 2019

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

...