【问题标题】:RxJava infinite stream best practiceRxJava 无限流最佳实践
【发布时间】:2015-03-24 19:46:36
【问题描述】:

在 android 应用程序中我有这种情况:

用 observable 收听我的 editText:

WidgetObservable.text(myEditText, false)
    .map { it.text().toString() }
    .debounce(800, TimeUnit.MILLISECONDS, Schedulers.io())

然后我需要使用 observable 发出的字符串发送网络请求:

    .flatMap { networkObservable.subscribeOn(Schedulers.io()) }

我的问题是:编写这些网络结果的无限流的最佳方法是什么。 由 UI 处理的错误。

使用 AppObservable.bindActivity() 包装器完成取消订阅

我最终将 materialize() 操作符附加到网络 observable,然后像这样处理它:

    .subscribe{
          when (it.getKind()) {
            Kind.OnNext  -> text.setText(it.getValue())
            Kind.OnError -> text.setText(it.getThrowable().getMessage())
          }
    }

你知道更好的方法吗,还是很好? 至少它有效。

附:另一个有用的案例是 Refresh button clicks flatMap'ed to network calls

【问题讨论】:

    标签: android rx-java


    【解决方案1】:

    您可以使用onErrorResumeNext 从故障中恢复您的 Observable。例如,

    WidgetObservable.text(myEditText, false)
        .map { it.text().toString() }
        .debounce(800, TimeUnit.MILLISECONDS, Schedulers.io())
        .flatMap {
              networkObservable.subscribeOn(Schedulers.io())
                               .onErrorResumeNext(t -> t.getMessage())
        }
    

    【讨论】:

    • 这意味着我需要一些包含正常和错误状态的包装器对象,它将在 flatMap 转换后发出?在可读性和开销方面,我的解决方案似乎更好。没有?
    • 你也可以在外层 Observable 中使用onErrorResumeNext,而不是在 flatMap 中。
    • 非常感谢!我理解这种方法。如果有人知道其他人,请发布新答案!
    • 对不起,我刚刚意识到在外部 Observable 中使用 onErrorResumeNext 是错误的。因为上游只发出一个onError 事件而忽略其他事件。
    • 你能把外部操作移到内部 flatMap 中吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2012-03-22
    相关资源
    最近更新 更多