通过以下链接实现了缓存:https://blog.mindorks.com/implement-caching-in-android-using-rxjava-operators
fun getSavedAddressList(): Maybe<List<SavedAddress>?>? {
return Observable.concat(
getAddressListMemory(),
getAddressListDatabase(),
getAddressListNetwork()).firstElement()
}
fun getAddressListDatabase(): Observable<List<SavedAddress>?> {
return Observable.create(ObservableOnSubscribe { emitter: ObservableEmitter<List<SavedAddress>?> ->
val list: ArrayList<SavedAddress> = addressDao.getAddressList() as ArrayList<SavedAddress>
if (list.isNotEmpty()) {
emitter.onNext(list)
}
emitter.onComplete()
if (list.isNotEmpty())
getAddressListNetwork().subscribeOn(schedulerProvider.io())?.observeOn(schedulerProvider.io())?.subscribe()
})
}
存储到数据库中之后,数据库中的项目可以完美地检索到
问题是从数据库获取列表后没有发生网络调用
我想依次获取三个数据源并将最新数据存储在数据库中
首先,您要在其中泄漏getAddressListNetwork
Disposable
,因为您试图在getAddressListDatabase
内部进行过多操作。
我认为您想要的是这:
fun getSavedAddressList(): Observable<List<SavedAddress>> {
return Observable.concat(
getAddressListMemory(),
getAddressListDatabase(),
getAddressListNetwork()).distinctUntilChanged())
}
[这将始终尝试从3个源中获取地址,并且仅在数据与先前的发射不同时才发射,这意味着数据是“刷新器”。
老实说,我认为您需要了解“陈旧数据”和“缓存无效”的概念。