我的情景与此图片非常相似:
应用程序的流程如下:
RxAndroid
创建一个observable,以从缓存/本地文件中获取数据。Retrofit
和RxJava
进行另一次网络通话,使用来自网络服务的新数据再次更新视图。所以,我正在两次更新视图(一个来自本地文件,之后就是通过webservices)
如何使用RxJava
和RxAndroid
获得结果?我在想的是
onNext
的{{1}}方法中,我可以创建另一个observable1
。observable2
我可以更新本地文件。
现在,我将如何使用更新的数据(加载到文件中)更新observable2.onNext()
?什么是好方法?
答案 0 :(得分:3)
我写了一篇关于这个场景的博文。我使用merge运算符(由sockeqwe建议)来解决您的问题' 2'和' 4'并行,doOnNext来解决' 5':
// NetworkRepository.java
public Observable<Data> getData() {
// implementation
}
// DiskRepository.java
public Observable<Data> getData() {
// implementation
}
// DiskRepository.java
public void saveData(Data data) {
// implementation
}
// DomainService.java
public Observable<Data> getMergedData() {
return Observable.merge(
diskRepository.getData().subscribeOn(Schedulers.io()),
networkRepository.getData()
.doOnNext(new Action1<Data>() {
@Override
public void call(Data data) {
diskRepository.saveData(data); // <-- save to cache
}
}).subscribeOn(Schedulers.io())
);
}
在我的博客文章中,我另外使用filter和Timestamp来跳过更新UI,如果数据相同或者缓存是空的(您没有指定这一点,但您很可能也遇到了这个问题。)
链接到帖子:https://medium.com/@murki/chaining-multiple-sources-with-rxjava-20eb6850e5d9
答案 1 :(得分:0)
它们之间的区别是:
合并可以交错合并的Observables发出的项目(类似的运算符Concat,不会交错项目,但会在开始从下一个源Observable发出项目之前依次发出每个源Observable的所有项目。)
Observable retroFitBackendObservable = retrofitBackend.getFoo().doOnNext(save_it_into_local_file );
Observable mergedObservable = Observable.merge(cacheObservable, retroFitBackendObservable);
mergedObservable.subscribe( ... );
然后订阅mergedObservable并在onNext()