1

这是使用 RxBindings 的示例 Rx 链:

RxView.clicks(refreshIcon)
        .flatMap { Observable.error<Throwable>(IllegalArgumentException()) }
        .subscribe(
                { Timber.d("onNext")},
                { error -> Timber.d("onError") })
        .addTo(disposables)

单击我的刷新图标一次后,该链将不会再次运行,因为发生了终端事件。我猜我有一个错误的印象,即只要检测到点击事件就会发生订阅,并且实际上只要执行该代码块时它就会订阅。

问题是如何让我的链在每次点击时执行/重新执行,即使它遇到终端事件?寻找直观的东西。

4

2 回答 2

2

Observable必须在第一个错误发生时完成,这是在他们的合同中。为了让您的Observable终端事件幸存下来,您将不得不深入研究 RxJava错误处理运算符retry()似乎很适合您的情况:

RxView.clicks(refreshIcon)
        .flatMap { ... }
        .retry()
        .subscribe(...)
        .addTo(disposables)
于 2018-03-12T13:14:33.360 回答
1

它是 Rx 合约的一部分,当发生错误时,流将收到 onError 事件并终止。除非您主动处理错误,例如使用:onErrorResumeNext()

于 2018-03-12T15:57:57.663 回答