Rxjava 从服务器获取数据并在访问缓存时更新缓存
Posted
技术标签:
【中文标题】Rxjava 从服务器获取数据并在访问缓存时更新缓存【英文标题】:Rxjava fetch data from server and update cache when cache is accessed 【发布时间】:2021-09-08 03:19:51 【问题描述】:我有一个用例,我需要从缓存中获取数据,然后使用来自服务器的数据更新缓存。这样,当我下次访问缓存时,它将获得更新的数据。我尝试使用 concat() 和 merge() 运算符来组合缓存和网络调用,但在客户端我只需要第一个值一旦发出缓存值,网络调用 observable 就会被释放。 下面是我正在使用的代码,有没有更好的方法来实现这一点。目前我正在使用 doOnSuccess 方法进行订阅,这不是正确的方法。
class DataKit
var cachedData: Data? = null
fun getData(): Single<Data>
return if(cachedData != null)
Single.just(cachedData)
.doOnSuccess
getPinInfo()
.subscribeOn(schedulerProvider.io())
.subscribeBy(defaultErrorFun)
else getPinInfo()
fun getPinInfo():Single<Data>
api.getDataFromServer()
.doOnSuccess cachedData = it
.doOnErrorcachedData = null
【问题讨论】:
【参考方案1】:我相信你可以在没有 if/else 条件的情况下将它写成 2 行作为一个序列:
fun getData(): Single<Data>
return Maybe.fromOptional(Optional.ofNullable(cachedData))
.switchIfEmpty(getPinInfo)
如果您还需要在缓存存在的情况下进行服务器调用,您可以使用flatMapSingle
运算符:
.flatMapSingle getPinInfo
但我不确定这是否有意义,我的意思是发出额外的请求只是为了更新缓存值。
如果您需要获取缓存值,然后使用从服务器接收到的值更新它,可以使用Flowable
。
【讨论】:
flatMapSingle getPinInfo 在这里无济于事,因为它会增加响应时间。以上是关于Rxjava 从服务器获取数据并在访问缓存时更新缓存的主要内容,如果未能解决你的问题,请参考以下文章