如何解决RxJava 的 retryWhen 意外地一直重试
任何人都可以......
我认为 retrywhen
有 50% 的几率因为 Random.nextBoolean()
而被调用。但是,一旦被调用,就会进入无限循环。
import io.reactivex.rxjava3.core.Observable
import kotlin.random.Random
fun main() {
Observable
.just(Unit)
.flatMap {
if (Random.nextBoolean()) {
Observable.just(Unit)
} else {
Observable.error(Throwable())
}.retrywhen {
it.flatMap {
println("retrywhen")
Observable.just(Unit)
}
}
}
.subscribe()
}
输出:
retrywhen
retrywhen
retrywhen
⋮
(continued)
解决方法
-
您已将
retryWhen
应用于 if 语句任一分支的执行结果。 -
将
retryWhen
运算符链接到由flatMap
生成的流:
例如
Observable
.just(Unit)
.flatMap {
if(Random.nextBoolean()) {
Observable.just(Unit)
} else {
Observable.error(Throwable())
}
}
.retryWhen {
it.flatMap {
println("retryWhen")
Observable.just(Unit)
}
}
.subscribe()
,
请看同样的question and answer
复制答案:retryWhen
在 Observer
订阅它时调用提供的函数,因此您有一个主序列伴随着一个序列,该序列发出主序列失败的 Throwable
。您应该将逻辑组合到您在此 Observable
中获得的 Function
上,因此最后,一个 Throwable
将在另一端产生一个值。
Observable
.just(Unit)
.flatMap {
if (Random.nextBoolean()) {
Observable.just(Unit)
} else {
Observable.error(Throwable())
}.retryWhen {
it.takeWhile {
Random.nextBoolean()
}
.doOnNext {
println("retryWhen")
}
}
}
.subscribe()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。