Субъект игнорирует onNext от другого наблюдаемого - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь создать заглушку объекта, который должен выдавать данные в мой ViewModel. Для этого я создаю свойство и субъект, который уведомляет наблюдателей о том, что это свойство изменилось (насколько мне известно, мне нужен объект BehaviorSubject).

private var weekRecord: WeekRecord = emptyRecord()

private val subject = BehaviorSubject.create<WeekRecord>()

Существует два метода: один вызывается из ViewModel основного фрагмента, в то время как другой вызывается из ViewModels всех фрагментов ViewPager, помещенного в основной фрагмент.

Первый метод должен загрузить данные с сервера и сохранить их в некотором хранилище, а затем уведомить основной фрагмент о том, что загрузка завершена.

// MainViewModel subscribes to this completable and observes it on mainThread
fun loadWeek(): Completable {
    return Completable.fromCallable {
            // pretend that we are loading data from server and saving it in the storage
            createFakeRecord()
        }
        .subscribeOn(Schedulers.io())
        .delaySubscription(10, TimeUnit.SECONDS)
}

fun createFakeRecord() {
    weekRecord = // some fake record
    // notify observers that storage content changed
    subject.onNext(weekRecord)
}

Второй метод возвращает наблюдаемый, чтобы страницы могли отслеживать соответствующие изменения в хранилище.

// PageViewModel subscribes to this observable and observes it on mainThread 
fun loadDayRecord(dayId: Int): Observable<DayRecord> {
    return subject
        .subscribeOn(Schedulers.io())
        .map { week ->
            // extract day that this observer needs
            week.dayRecordList[dayId]
        }
    .subscribeOn(Schedulers.io())
}

Подписка в PageViewModel:

dayObserver = taskUseCase
        .loadDayRecord(dayId)
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(
            { record ->
                Log.d("Page", record.date.toString())
            },
            { e ->
                Log.e("Page", e.message, e)
            }
        )

Проблема в том, что субъект, кажется, игнорирует элемент, который я передаю в onNext в createFakeRecord(). После 10 секунд задержки основной фрагмент уведомляется о завершении, но фрагменты страницы ничего не получают. Как мне передать новые значения?

1 Ответ

0 голосов
/ 13 марта 2020

Проблема была не в том, как испускались элементы, случайно я забыл указать область зависимости заглушки в Dagger, и поэтому у каждого фрагмента был свой экземпляр объекта-заглушки, но загружены данные были только у первого .

...