在RxJava中,如何在出错时重试/恢复,而不是完成observable

xor*_*ate 6 java android rx-java rx-android

我想要实现的是:

  • 监控某个变化的偏好
  • 检测到更改时,使用新值启动新的网络呼叫
  • 转换结果
  • 在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
Run Code Online (Sandbox Code Playgroud)

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

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

dwu*_*sen 7

您不必为您处理错误,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));
Run Code Online (Sandbox Code Playgroud)