RxJava 和 RxAndroid 的结合?
Combination of RxJava and RxAndroid?
我的场景与这张图片非常相似:
应用程序的流程将是这样的:
- 视图需要更新。
- 使用
RxAndroid
创建一个可观察对象以从缓存/本地文件中获取数据。
- 更新视图。
- 使用
Retrofit
和 RxJava
进行另一个网络调用,以使用来自网络服务的新数据再次更新视图。
- 用新数据更新本地文件。
所以,我更新了两次视图(一次来自本地文件,然后是通过网络服务)
如何使用 RxJava
和 RxAndroid
获得结果?我在想的是
- 创建一个 observable1 以从本地文件系统获取数据。
- 在
observable1
的 onNext
方法中,我可以创建另一个 observable2
。
observable2.onNext()
我可以更新本地文件。
现在,我将如何使用更新后的数据(加载到文件中)更新 view
?
什么是好的方法?
看起来 concat or merge 运算符就是您要查找的内容
它们的区别是:
Merge may interleave the items emitted by the merged Observables (a similar operator, Concat, does not interleave items, but emits all of each source Observable’s items in turn before beginning to emit items from the next source Observable).
Observable retroFitBackendObservable = retrofitBackend.getFoo().doOnNext(save_it_into_local_file );
Observable mergedObservable = Observable.merge(cacheObservable, retroFitBackendObservable);
mergedObservable.subscribe( ... );
然后订阅 mergedObservable 并在 onNext()
中更新您的视图
我写了一篇博客 post 关于完全相同的场景。我使用 merge operator (as suggested by sockeqwe) to address your points '2' and '4' in parallel, and 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())
);
}
在我的博客 post 中,如果数据相同或缓存为空(您没有指定,但您也可能 运行 进入这个问题。
Link 到 post: https://medium.com/@murki/chaining-multiple-sources-with-rxjava-20eb6850e5d9
我的场景与这张图片非常相似:
应用程序的流程将是这样的:
- 视图需要更新。
- 使用
RxAndroid
创建一个可观察对象以从缓存/本地文件中获取数据。 - 更新视图。
- 使用
Retrofit
和RxJava
进行另一个网络调用,以使用来自网络服务的新数据再次更新视图。 - 用新数据更新本地文件。
所以,我更新了两次视图(一次来自本地文件,然后是通过网络服务)
如何使用 RxJava
和 RxAndroid
获得结果?我在想的是
- 创建一个 observable1 以从本地文件系统获取数据。
- 在
observable1
的onNext
方法中,我可以创建另一个observable2
。 observable2.onNext()
我可以更新本地文件。 现在,我将如何使用更新后的数据(加载到文件中)更新view
?
什么是好的方法?
看起来 concat or merge 运算符就是您要查找的内容
它们的区别是:
Merge may interleave the items emitted by the merged Observables (a similar operator, Concat, does not interleave items, but emits all of each source Observable’s items in turn before beginning to emit items from the next source Observable).
Observable retroFitBackendObservable = retrofitBackend.getFoo().doOnNext(save_it_into_local_file );
Observable mergedObservable = Observable.merge(cacheObservable, retroFitBackendObservable);
mergedObservable.subscribe( ... );
然后订阅 mergedObservable 并在 onNext()
我写了一篇博客 post 关于完全相同的场景。我使用 merge operator (as suggested by sockeqwe) to address your points '2' and '4' in parallel, and 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())
);
}
在我的博客 post 中,如果数据相同或缓存为空(您没有指定,但您也可能 运行 进入这个问题。
Link 到 post: https://medium.com/@murki/chaining-multiple-sources-with-rxjava-20eb6850e5d9