RxJava和RxAndroid的组合?

我的场景与此图像非常相似:

在此处输入图像描述

应用程序的流程将如下所示:

  1. 查看需要更新。
  2. 使用RxAndroid创建一个observable来从缓存/本地文件中获取数据。
  3. 更新视图。
  4. 使用RetrofitRxJava进行另一次网络呼叫,使用来自Web服务的新数据再次更新视图。
  5. 使用新数据更新本地文件。

所以,我正在两次更新视图(一个来自本地文件,之后就是通过webservices)

如何使用RxJavaRxAndroid实现结果? 我在想的是

  1. 创建observable1以从本地文件系统获取数据。
  2. observable1onNext方法中,我可以创建另一个observable2
  3. observable2.onNext()我可以更新本地文件。 现在,我将如何使用更新的数据更新view (加载到文件中)?

什么是好方法?

我写了一篇关于这个场景的博客文章。 我使用了合并运算符(由sockeqwe建议)并行处理点’2’和’4’,并使用doOnNext来解决’5’:

 // NetworkRepository.java public Observable getData() { // implementation } // DiskRepository.java public Observable getData() { // implementation } // DiskRepository.java public void saveData(Data data) { // implementation } // DomainService.java public Observable getMergedData() { return Observable.merge( diskRepository.getData().subscribeOn(Schedulers.io()), networkRepository.getData() .doOnNext(new Action1() { @Override public void call(Data data) { diskRepository.saveData(data); // <-- save to cache } }).subscribeOn(Schedulers.io()) ); } 

在我的博客文章中,我另外使用filter和时间戳来跳过更新UI,如果数据相同或缓存是空的(你没有指定这个,但你也可能遇到这个问题)。

链接到post: https : //medium.com/@murki/chaining-multiple-sources-with-rxjava-20eb6850e5d9

看起来像concat或merge运算符是你正在寻找的

他们之间的区别是:

合并可以交错合并的Observables发出的项目(类似的运算符,Concat,不交错项目,但在开始从下一个源Observable发出项目之前依次发出每个源Observable的所有项目)。

 Observable retroFitBackendObservable = retrofitBackend.getFoo().doOnNext(save_it_into_local_file ); Observable mergedObservable = Observable.merge(cacheObservable, retroFitBackendObservable); mergedObservable.subscribe( ... ); 

然后订阅mergedObservable并在onNext()更新您的视图