RxJava和RxAndroid的组合?

时间:2016-03-23 15:27:36

标签: java android rx-java rx-android reactivex

我的情景与此图片非常相似:

enter image description here

应用程序的流程如下:

  1. 查看需要更新。
  2. 使用RxAndroid创建一个observable,以从缓存/本地文件中获取数据。
  3. 更新视图。
  4. 使用RetrofitRxJava进行另一次网络通话,使用来自网络服务的新数据再次更新视图。
  5. 使用新数据更新本地文件。
  6. 所以,我正在两次更新视图(一个来自本地文件,之后就是通过webservices)

    如何使用RxJavaRxAndroid获得结果?我在想的是

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

2 个答案:

答案 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())
  );
}

在我的博客文章中,我另外使用filterTimestamp来跳过更新UI,如果数据相同或者缓存是空的(您没有指定这一点,但您很可能也遇到了这个问题。)

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

答案 1 :(得分:0)

看起来concatmerge运营商正在寻找

它们之间的区别是:

  

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

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

然后订阅mergedObservable并在onNext()

中更新您的视图