使用Rx2Apollo在RxJava上重试

时间:2018-01-18 18:01:57

标签: android rx-java

我使用Rx2Apollo进行graphql调用:

private fun registerCardToken(token: String): io.reactivex.Observable<RegisterCardTokenMutation.RegisterCreditCard> {
    val apolloCall = apolloClient().mutate(RegisterCardTokenMutation.builder().token(token).build())
    return Rx2Apollo.from(apolloCall).map {
        (it.data() as RegisterCardTokenMutation.Data).registerCreditCard()
    }.doOnError({ error ->
        //Log.e("registerCardToke", error.message)
    })


}

这很好用,但我想处理特定错误并重试此操作。我尝试使用retryWhenretry解决此问题,但尚未编写任何可执行代码。

在执行实际重试之前重试令牌刷新。这是令牌刷新示例:

private fun refreshBearerToken(callback: OnCompleteListener<GetTokenResult>) {
        FirebaseAuth.getInstance().currentUser?.getIdToken(true)?.addOnCompleteListener(callback)
    }

1 个答案:

答案 0 :(得分:1)

首先,您必须将refreshBearerToken变为Observable

val refreshTokenSource = Observable.create({ emitter ->
    FirebaseAuth.
     getInstance().
     currentUser?.
     getIdToken(true)?.
     addOnCompleteListener({ task -> 
         if (task.isSuccessful()) {
             emitter.onNext(task.getResult())
             emitter.onComplete()
         } else {
             emitter.onError(task.getException())
         }
     }) 
})

其次,使用一些持有当前令牌的外部引用并在调用registerCardToken之前有条件地使用它:

 val currentToken = AtomicReference<String>()

 val registerCardTokenObservable = Observable.defer({
     val token = currentToken.get()
     if (token == null) {
         return refreshTokenSource
            .doOnNext({ currentToken.set(it) })
            .flatMap({ registerCardToken(it) })
     }
     return registerCardToken(token)
 })
 .retry({ error -> 
     if ((error is IOException) || (error.getMessage().contains("network")) {
         currentToken.set(null)
         return true
     }
     return false
 })