Проблема при интеграции кэширования с оператором concat в Rx java - PullRequest
0 голосов
/ 24 апреля 2020

Реализовано кэширование по следующей ссылке: 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()
        })
    }

элементы в базе данных отлично извлекаются после сохранения в базе данных

проблема в том, что сетевой вызов не происходит после получения списка из базы данных

Я хочу получать три источника данных последовательно один за другим и сохранять последние данные в базе данных

1 Ответ

1 голос
/ 03 мая 2020

Прежде всего, вы пропускаете туда getAddressListNetwork Disposable, потому что вы пытаетесь сделать слишком много внутри getAddressListDatabase.

Я думаю, что вы хотите это:

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

Это всегда будет пытаться получить адреса из 3 источников, и отправлять их только в том случае, если данные отличаются от предыдущего, то есть данные «более свежие».

Если честно Я думаю, что вам нужно взглянуть на понятия «устаревшие данные» и «аннулирование кэша».

...