RxJava网络请求和缓存

我正在寻求一个流程的例子,我试图在RxJava的帮助下实现。

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

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

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

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

    如果它返回并且错误并且有缓存的内容,那么什么都不做。

现在我有一种类似的方法 (从Jake的u2020获得很多灵感)。 主要区别在于它使用内存缓存,这意味着不需要单独的Observable来从缓存中读取,并且可以同步完成。

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

有什么建议么?

这是我的解决方案:

 readDataFromCache().defaultIfEmpty(null) .flatMap(new Func1>() { @Override public Observable call(final Data data) { if (data == null) { // no cache, show the data from network or throw an error return apiCall(); } else { return Observable.concat( Observable.just(data), // something cached, show the data from network or do nothing. apiCall().onErrorResumeNext(Observable.empty())); } } }); 

我不添加subscribeOnobserveOn因为我不确定readDataFromCache()应该使用ioScheduler还是uiScheduler

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

 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()是我的数据的存根 – Subscriber应将其视为错误。

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


编辑:解决方案无法正常工作。 未完成一个用例(请参阅注释)。

编辑2:嗯,经过一些调整后,解决方案可以正常工作。 修复程序返回不同types的observable,具体取决于内存缓存的状态。 有点脏。