在 RxJava 中,如何 retry/resume 出错,而不是完成可观察的
In RxJava, how to retry/resume on error, instead of completing the observable
我要实现的是:
- 监控偏好以进行特定更改
- 当检测到变化时,使用新值开始新的网络调用
- 转换结果
- 显示结果 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 完好无损,这样我就可以向它抛出另一个值?我可以想象一个简单的重试按钮,它只想忽略发生错误的事实。
您不必处理 mViewPeriodSubject
的错误,而是处理改造 Observable 上的错误。这个改造 Observable 不会恢复,但至少,它不会影响你的 "main" 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));
我要实现的是:
- 监控偏好以进行特定更改
- 当检测到变化时,使用新值开始新的网络调用
- 转换结果
- 显示结果 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 完好无损,这样我就可以向它抛出另一个值?我可以想象一个简单的重试按钮,它只想忽略发生错误的事实。
您不必处理 mViewPeriodSubject
的错误,而是处理改造 Observable 上的错误。这个改造 Observable 不会恢复,但至少,它不会影响你的 "main" 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));