Android 使用Rx2Apollo在RxJava上重试

Android 使用Rx2Apollo在RxJava上重试,android,rx-java,Android,Rx Java,我正在使用Rx2Apollo进行graphql调用: private fun registerCardToken(token: String): io.reactivex.Observable<RegisterCardTokenMutation.RegisterCreditCard> { val apolloCall = apolloClient().mutate(RegisterCardTokenMutation.builder().token(token).build()

我正在使用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)
    })


}

首先,您必须将
RefreshBearToken
转换为
可观察的

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
 })
val currentToken=AtomicReference()
val registerCardTokenObservable=可观察。延迟({
val token=currentToken.get()
if(标记==null){
返回刷新令牌源
.doOnNext({currentToken.set(it)})
.flatMap({registerCardToken(it)})
}
返回注册表CardToken(令牌)
})
.重试({错误->
如果((错误为IOException)| |(error.getMessage().contains(“网络”)){
currentToken.set(空)
返回真值
}
返回错误
})

存在一个重载,让您决定是否重试某个特定的异常。@akarnokd执行任何代码片段或说明that@akarnokd,是否有一种方法可以在重试之前添加操作,在我的情况下,我确实希望请求一个新令牌,然后使用该新令牌执行重试。该令牌来自何处?@阿卡诺克,我刚做了一次编辑
 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
 })