【问题标题】:Combination of RxJava and RxAndroid?RxJava 和 RxAndroid 的结合?
【发布时间】:2016-03-23 15:27:35
【问题描述】:

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

应用的流程是这样的:

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

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

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

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

什么是好的方法?

【问题讨论】:

  • 仅供参考 RXAndroid 已被弃用,其功能已被纳入 RXBindings
  • observable1 发出了什么?

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


【解决方案1】:

我写了一篇关于完全相同场景的博客文章。我使用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

【讨论】:

    【解决方案2】:

    看起来 concatmerge 运算符就是您要查找的内容

    它们的区别是:

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

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

    然后订阅mergedObservable并更新onNext()中的视图

    【讨论】:

      猜你喜欢
      • 2018-09-14
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 2020-11-09
      • 2016-12-14
      • 1970-01-01
      相关资源
      最近更新 更多