具有异常的Observable.concat

时间:2018-03-14 15:16:48

标签: java android rx-java rx-java2

我有2个数据源:数据库和服务器。当我启动应用程序时,我从存储库(MyRepository)调用该方法:

public Observable<List<MyObj>> fetchMyObjs() {
    Observable<List<MyObj>> localData = mLocalDataSource.fetchMyObjs();
    Observable<List<MyObj>> remoteData = mRemoteDataSource.fetchMyObjs();
    return Observable.concat(localData, remoteData);
}

我订阅如下:

mMyRepository.fetchMyObjs()         
            .compose(applySchedulers())
            .subscribe(
                    myObjs -> {
                        //do somthing
                    },
                    throwable ->  {
                        //handle error
                    }
            );

我希望数据库中的数据加载速度更快,当从网络下载数据完成后,我只需更新Activity中的数据。

连接互联网后,一切运作良好。但是当我们在没有连接到网络的情况下打开应用程序时,mRemoteDataSource.fetchMyObjs();抛出UnknownHostException并且所有Observable结束(localData的订阅者不起作用(尽管日志告诉来自数据库已被采取))。当我尝试再次从MyRepository类(通过SwipeRefresh)调用fetchMyObjs()方法时,将触发localData的订阅者。

如何摆脱网络关闭时,应用程序启动时,订阅者是否适用于localData

2 个答案:

答案 0 :(得分:1)

尝试一些错误处理操作符:

https://github.com/ReactiveX/RxJava/wiki/Error-Handling-Operators

我猜onErrorResumeNext()会很好,但你必须自己测试一下。也许这样的事情对你有用:

Observable<List<MyObj>> remoteData = mRemoteDataSource.fetchMyObjs()
      .onErrorResumeNext()

另外,我无法判断你的想法是否正确,但考虑重建这一流程可能值得考虑。忽视错误是不对的 - 这是肯定的;)

答案 1 :(得分:0)

您可以将 observeOn(Scheduler scheduler, boolean delayError)delayError 设置为 true 来观察您的链。

<块引用>

delayError - 指示 onError 通知是否可能不会在调度边界的另一侧提前 onNext 通知。如果为 true,则以 onError 结尾的序列将按照从上游接收到的相同顺序重放