RxJava和RxAndroid的组合?
我的场景与此图像非常相似:
应用程序的流程将如下所示:
- 查看需要更新。
- 使用
RxAndroid
创建一个observable来从缓存/本地文件中获取数据。 - 更新视图。
- 使用
Retrofit
和RxJava
进行另一次网络呼叫,使用来自Web服务的新数据再次更新视图。 - 使用新数据更新本地文件。
所以,我正在两次更新视图(一个来自本地文件,之后就是通过webservices)
如何使用RxJava
和RxAndroid
实现结果? 我在想的是
- 创建observable1以从本地文件系统获取数据。
- 在
observable1
的onNext
方法中,我可以创建另一个observable2
。 -
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()
更新您的视图