Я пытаюсь создать заглушку объекта, который должен выдавать данные в мой 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 секунд задержки основной фрагмент уведомляется о завершении, но фрагменты страницы ничего не получают. Как мне передать новые значения?