1

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

在此处输入图像描述

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

  1. 视图需要更新。
  2. 创建一个 observableRxAndroid用于从缓存/本地文件中获取数据。
  3. 更新视图。
  4. Retrofit使用和再次进行网络调用,使用RxJava来自 Web 服务的新数据再次更新视图。
  5. 使用新数据更新本地文件。

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

如何使用RxJavaand实现结果RxAndroid?我在想的是

  1. 创建一个 observable1 以从本地文件系统获取数据。
  2. 在我可以创建另一个的onNext方法中。observable1observable2
  3. observable2.onNext()我可以更新本地文件。现在我将如何view使用更新的数据(加载到文件中)来更新?

什么是好方法?

4

2 回答 2

3

我写了一篇关于完全相同场景的博客文章。我使用合并运算符(如 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())
  );
}

在我的博客文章中,如果数据相同或缓存为空,我还使用过滤器时间戳来跳过更新 UI(您没有指定这一点,但您也可能会遇到此问题)。

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

于 2016-03-23T21:57:09.587 回答
0

看起来你正在寻找concatmerge运算符

它们之间的区别是:

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

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

然后订阅 mergeObservable 并更新您的视图onNext()

于 2016-03-23T15:52:32.740 回答