RxJava 和 RxAndroid 的结合?

Combination of RxJava and RxAndroid?

我的场景与这张图片非常相似:

应用程序的流程将是这样的:

  1. 视图需要更新。
  2. 使用 RxAndroid 创建一个可观察对象以从缓存/本地文件中获取数据。
  3. 更新视图。
  4. 使用 RetrofitRxJava 进行另一个网络调用,以使用来自网络服务的新数据再次更新视图。
  5. 用新数据更新本地文件。

所以,我更新了两次视图(一次来自本地文件,然后是通过网络服务)

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

  1. 创建一个 observable1 以从本地文件系统获取数据。
  2. observable1onNext 方法中,我可以创建另一个 observable2
  3. 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