RxView.clicks() 在 onError 事件后死亡
RxView.clicks() dies after onError event
这是一个使用 RxBindings 的示例 Rx 链:
RxView.clicks(refreshIcon)
.flatMap { Observable.error<Throwable>(IllegalArgumentException()) }
.subscribe(
{ Timber.d("onNext")},
{ error -> Timber.d("onError") })
.addTo(disposables)
单击我的刷新图标一次后,由于发生了终止事件,此链不会再次 运行。我猜我误以为只要检测到点击事件就会进行订阅,而实际上只要执行该代码块就会进行订阅。
问题是如何在每次点击时都创建我的链条 execute/re-execute,即使它点击了终端事件?寻找直观的东西。
Observable
必须在第一个错误发生时完成,这是他们的合同。为了让你的 Observable
在终端事件中幸存下来,你将不得不深入研究 RxJava Error handling operators. retry()
似乎很适合你的情况:
RxView.clicks(refreshIcon)
.flatMap { ... }
.retry()
.subscribe(...)
.addTo(disposables)
它是 Rx 合同的一部分,当发生错误时,流将收到一个 onError 事件并将终止。
除非你主动处理错误,例如使用:onErrorResumeNext()
这是一个使用 RxBindings 的示例 Rx 链:
RxView.clicks(refreshIcon)
.flatMap { Observable.error<Throwable>(IllegalArgumentException()) }
.subscribe(
{ Timber.d("onNext")},
{ error -> Timber.d("onError") })
.addTo(disposables)
单击我的刷新图标一次后,由于发生了终止事件,此链不会再次 运行。我猜我误以为只要检测到点击事件就会进行订阅,而实际上只要执行该代码块就会进行订阅。
问题是如何在每次点击时都创建我的链条 execute/re-execute,即使它点击了终端事件?寻找直观的东西。
Observable
必须在第一个错误发生时完成,这是他们的合同。为了让你的 Observable
在终端事件中幸存下来,你将不得不深入研究 RxJava Error handling operators. retry()
似乎很适合你的情况:
RxView.clicks(refreshIcon)
.flatMap { ... }
.retry()
.subscribe(...)
.addTo(disposables)
它是 Rx 合同的一部分,当发生错误时,流将收到一个 onError 事件并将终止。 除非你主动处理错误,例如使用:onErrorResumeNext()