主题从另一个可观察的对象忽略onNext

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

我正在尝试为一个应该向我的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秒后,通知主片段已完成,但页面片段未收到任何内容。我应该如何传递新值?

android kotlin rx-java2
1个回答
0
投票

问题不是项目发出的方式,偶然地,我忘记了在Dagger中指定存根依赖项的范围,因此每个片段都得到了它自己的存根对象实例,但是只有第一个片段加载了它的数据。

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