【问题标题】:RxView.clicks() dies after onError eventRxView.clicks() 在 onError 事件后死亡
【发布时间】:2018-03-12 12:48:47
【问题描述】:

这是一个使用 RxBindings 的示例 Rx 链:

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

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

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

【问题讨论】:

    标签: android kotlin rx-java rx-java2 rx-binding


    【解决方案1】:

    Observable 必须在第一个错误发生时完成,这是在他们的合同中。为了让你的Observable 在终端事件中幸存下来,你必须在 RxJava 中挖掘Error handling operatorsretry() 似乎很适合您的情况:

    RxView.clicks(refreshIcon)
            .flatMap { ... }
            .retry()
            .subscribe(...)
            .addTo(disposables)
    

    【讨论】:

    • 正如我所怀疑的那样。如果我使用单子,链条不会终止吗?我猜我只是在 subscribe() 块中处理 monad?
    • 我为您添加了相关示例。我还删除了单子题外话,因为它比帮助更令人困惑。包裹在 monad 中会终止,除非你自己写一些复杂的操作符。
    • 这似乎行得通。所以当观察一个热源时,retry 会重新订阅,但是会等待下一次发射。很高兴知道这一点。谢谢。
    • 既然问题解决了,也许你可以接受这个答案。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 2014-02-16
      • 2014-11-08
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      相关资源
      最近更新 更多