在RxJava,如何重试/恢复,而不是在完成观察到的错误, [英] In RxJava, how to retry/resume on error, instead of completing the observable
问题描述
我想实现的是:
- 显示器preferences一定变化
- 当检测到变化时,使用新的价值开始新的网络呼叫
- 变换结果
- 的显示效果在用户界面
我知道什么时候会发生变化,现在我presume我需要调用onNext一个主题。这样,就可以触发一个接收链,并在结束时,我可以更新UI。
I know when the change happens, now I presume I need to call onNext on a Subject. This should then trigger a Rx chain, and in the end I can update the 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()不会导致另一个网络呼叫的情况
But in the case of the network call failing, the observable errors, and calling onNext() does not result in another network call.
所以我的问题是,应该怎么处理呢?我怎样才能保持它的完整观测,所以我可以随便扔另一个值?我能想到的例子,只是想忽略发生错误的事实,一个简单的重试按钮。
So my question is, how should I handle this? How can I keep the Observable intact so I can just throw another value at it? I can imagine for example a simple retry button that just wants to ignore the fact that an error occurred.
推荐答案
您不必处理错误与 mViewPeriodSubject
而是,对付你的改造错误观察到。这种改造观测将不会恢复,但至少,它不会影响你的主观察到。
You don't have to deal error with your mViewPeriodSubject
but instead, deal with errors on your retrofit Observable. This retrofit Observable won't resume, but at least, it won't affect your "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));
这篇关于在RxJava,如何重试/恢复,而不是在完成观察到的错误,的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!