【问题标题】:In RxJava, how to retry/resume on error, instead of completing the observable在 RxJava 中,如何在错误时重试/恢复,而不是完成 observable
【发布时间】:2015-07-06 13:04:24
【问题描述】:

我想要实现的是:

  • 监控特定更改的偏好
  • 检测到更改时,使用新值启动新的网络调用
  • 转换结果
  • 在 UI 中显示结果

我知道更改何时发生,现在我假设我需要在主题上调用 onNext。这应该会触发一个 Rx 链,最后我可以更新 UI。

mViewPeriodSubject = PublishSubject.create();

mAdapterObservable =
    mViewPeriodSubject
        .flatMap(period -> MyRetrofitAPI.getService().fetchData(period)) // this might fail
        .flatMap(Observable::from)
        .map(MyItem::modifyItem)
        .toList()
        .map(obj -> new MyAdapter(obj));


mViewPeriodSubject.onNext("week"); // this one starts the chain
mViewPeriodSubject.onNext("year"); // this one does not

但在网络调用失败的情况下,可观察到的错误,并且调用 onNext() 不会导致另一个网络调用。

所以我的问题是,我应该如何处理?我怎样才能保持 Observable 完整,这样我就可以向它抛出另一个值?例如,我可以想象一个简单的重试按钮,它只是想忽略发生错误的事实。

【问题讨论】:

标签: java android rx-java rx-android


【解决方案1】:

您不必处理 mViewPeriodSubject 的错误,而是处理改造 Observable 的错误。这个改造 Observable 不会恢复,但至少不会影响您的“主要” Observable。

mAdapterObservable =
mViewPeriodSubject
    .flatMap(period -> MyRetrofitAPI.getService().fetchData(period).onErrorResumeNext(e -> Observable.empty()) // this might fail
    .flatMap(Observable::from)
    .map(MyItem::modifyItem)
    .toList()
    .map(obj -> new MyAdapter(obj));

【讨论】:

  • 这个解决方案对我有用。它教会了我更多关于 RxJva 的知识。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 2016-10-04
  • 2015-10-28
  • 2018-06-29
  • 1970-01-01
相关资源
最近更新 更多