微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RxJava 的 retryWhen 意外地一直重试

如何解决RxJava 的 retryWhen 意外地一直重试

任何人都可以......

  1. 解释为什么以下代码会在调用 retrywhen 后无限期地重试?
  2. 更正代码以在 Random.nextBoolean() 时停止重试 返回 true

我认为 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)

解决方法

  1. 您已将 retryWhen 应用于 if 语句任一分支的执行结果。

  2. 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

复制答案:

retryWhenObserver 订阅它时调用提供的函数,因此您有一个主序列伴随着一个序列,该序列发出主序列失败的 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 举报,一经查实,本站将立刻删除。