我正在寻找一个我试图在 RxJava 的帮助下实现的流程示例。
假设我想显示一个数据列表。流程应如下所示:
- 读取缓存。如果它包含数据,则显示它;
向服务器发送 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/