我正在尝试为一个应该向我的ViewModel
发送数据的对象存根。为此,我创建一个属性和一个Subject来通知观察者此属性已更改(据我所知,我需要一个BehaviorSubject)。
private var weekRecord: WeekRecord = emptyRecord()
private val subject = BehaviorSubject.create<WeekRecord>()
[有两种方法:一种是从主片段的ViewModel调用的,另一种是从放置在主片段中的ViewPager
的所有片段的ViewModels调用的。
第一种方法应从服务器加载数据并将其保存在某些存储中,然后通知主片段加载已完成。
// 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)
}
第二种方法返回observable,以便页面可以跟踪存储中的相关更改。
// 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秒后,通知主片段已完成,但页面片段未收到任何内容。我应该如何传递新值?
问题不是项目发出的方式,偶然地,我忘记了在Dagger中指定存根依赖项的范围,因此每个片段都得到了它自己的存根对象实例,但是只有第一个片段加载了它的数据。