Android 使用Rx2Apollo在RxJava上重试
我正在使用Rx2Apollo进行graphql调用: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()
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
})