android - RxJava 网络请求和缓存

标签 android rx-java

我正在寻找一个我试图在 RxJava 的帮助下实现的流程示例。

假设我想显示一个数据列表。流程应如下所示:

  1. 读取缓存。如果它包含数据,则显示它;
  2. 向服务器发送 API 请求:

    如果它返回数据,则缓存它并显示它。

    如果它返回错误并且没有缓存数据,则显示错误。

    如果它返回错误并且缓存了一些东西,那么什么都不做。

现在我有一个 method that does something similar (灵感来自 Jake's u2020)。主要区别在于它使用内存缓存,这意味着不需要单独的 Observable 来从缓存中读取数据,它可以同步完成。

我不知道如何组合两个 observable(一个用于从缓存中读取,另一个用于 API 调用)并获得上述流程。

有什么建议吗?

最佳答案

我想我的问题已经解决了。可观察链看起来像这样:

apiCall()
        .map(data -> dataInMemory = data)
        .onErrorResumeNext(t -> data == null ?
                Observable.just(Data.empty()) : Observable.empty())
        .startWith(readDataFromCache().map(data -> dataInMemory = data))
        .subscribeOn(ioScheduler)
        .observeOn(uiScheduler)
        .subscribe(dataRequest);

要点是,如果 readDataFromCache() 抛出错误,它将调用 onCompleted() 而不会调用 onError()。所以它应该是一个你可以控制的自定义 Observable

Data.empty() 是我的数据的 stub - Subscriber 应该将其视为错误。

dataInMemory 是我的 Controller 中的一个成员,它充当内存缓存。


编辑:该解决方案无法正常工作。未完成一个用例(见评论)。

编辑 2:好吧,经过一些调整后,该解决方案确实正常工作。修复是根据内存缓存的状态返回不同类型的可观察对象。有点脏。

关于android - RxJava 网络请求和缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27229709/

相关文章:

java - Vertx Future 不会等待

java - 无限扩展 Rx Singles zip

android - 为什么当我向上或向下滚动列表时它会在我的自定义光标适配器中激活一个 Switch 监听器?

java - Android - 从蓝牙读取数据时出错

java - 使用 mapquest 在 Android 上获取路线点

java - RxJava 订阅时类型不匹配

java - 如何添加多个小部件?

android - 使用Android Studio启动新的Android项目

android - 使用Android Profiler找出ANR的原因

Android 将基本计时器转换为 RxJava