Rx Java中使用concat运算符集成缓存时出现的问题

问题描述 投票:0回答:1

通过以下链接实现了缓存: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()
        })
    }

存储到数据库中之后,数据库中的项目可以完美地检索到

问题是从数据库获取列表后没有发生网络调用

我想依次获取三个数据源并将最新数据存储在数据库中

kotlin retrofit rx-java rx-java2
1个回答
0
投票

首先,您要在其中泄漏getAddressListNetwork Disposable,因为您试图在getAddressListDatabase内部进行过多操作。

我认为您想要的是这:

fun getSavedAddressList(): Observable<List<SavedAddress>> {
    return Observable.concat(
            getAddressListMemory(),
            getAddressListDatabase(),
            getAddressListNetwork()).distinctUntilChanged())
}

[这将始终尝试从3个源中获取地址,并且仅在数据与先前的发射不同时才发射,这意味着数据是“刷新器”。

老实说,我认为您需要了解“陈旧数据”和“缓存无效”的概念。

© www.soinside.com 2019 - 2024. All rights reserved.