onNext() 永远不会在 PublishSubject 上被调用
onNext() never gets called on a PublishSubject
我正在尝试构建uild 一个在一段时间内计算一些事件的演示者,仅在第一次加载时显示加载,并在完成后更新 ui。因为可以通过多种方式(例如用户首选项)更新事件,所以我需要能够告诉演示者事件已更新并且必须再次刷新它们。这是我现在拥有的:
subject
.map<List<UpcomingRowViewModel>> {
provider.calculateEventsBetween(TimePeriod.aYearFrom(firstDay))
}
.doOnSubscribe {
view.showLoading()
}
.observeOn(resultScheduler)
.subscribeOn(workScheduler)
.subscribe { upcomingRowViewModels ->
view.display(upcomingRowViewModels)
}
subject.onNext(TRIGGER)
主题是 PublishSubject
Int。我在订阅后立即执行 onNext()
,因为我希望数据在我订阅后立即刷新。
上面的代码在我的单元测试中产生了奇迹,而且只有当我运行在设备连接了调试器的设备上运行它时才有效。如果我只是 运行 它(没有任何调试器),它会到达 view.showLoading()
部分,但不会到达 provider.calculateEventsBetween(TimePeriod.aYearFrom(firstDay)
所以 UI 通过加载获得 'stuck' 。
有什么想法吗?
您没有看到消费者来电的可能原因是 .subscribeOn(workScheduler)
。通过将此应用于 Subject
,它本身没有实际用途,因为在订阅 Subject
时没有订阅副作用,您可以延迟对 Subject
的订阅onNext
调用此时找不到任何观察者。
你可能想要的是这样的:
subject
.observeOn(resultScheduler) // <--------------- (1)
.doOnNext {
view.showLoading()
}
.observeOn(workScheduler) // <--------------- (2)
.map<List<UpcomingRowViewModel>> {
provider.calculateEventsBetween(
TimePeriod.aYearFrom(firstDay))
}
.observeOn(resultScheduler) // <--------------- (3)
.subscribe { upcomingRowViewModels ->
view.display(upcomingRowViewModels)
}
subject.onNext(TRIGGER)
而不是执行一次的 doOnSubscribe
,(1) 确保当有工作要做时,主题的 onNext 发射将触发主线程上的加载指示器(假设 resultScheduler 是 AndroidSchedulers.mainThread
在非测试中)。然后你想在主线程之外执行映射,因此 (2) 将项目移动到后台线程。映射完成后,结果项将再次移至主线程 (3),您的视图可以在其中显示它。
我正在尝试构建uild 一个在一段时间内计算一些事件的演示者,仅在第一次加载时显示加载,并在完成后更新 ui。因为可以通过多种方式(例如用户首选项)更新事件,所以我需要能够告诉演示者事件已更新并且必须再次刷新它们。这是我现在拥有的:
subject
.map<List<UpcomingRowViewModel>> {
provider.calculateEventsBetween(TimePeriod.aYearFrom(firstDay))
}
.doOnSubscribe {
view.showLoading()
}
.observeOn(resultScheduler)
.subscribeOn(workScheduler)
.subscribe { upcomingRowViewModels ->
view.display(upcomingRowViewModels)
}
subject.onNext(TRIGGER)
主题是 PublishSubject
Int。我在订阅后立即执行 onNext()
,因为我希望数据在我订阅后立即刷新。
上面的代码在我的单元测试中产生了奇迹,而且只有当我运行在设备连接了调试器的设备上运行它时才有效。如果我只是 运行 它(没有任何调试器),它会到达 view.showLoading()
部分,但不会到达 provider.calculateEventsBetween(TimePeriod.aYearFrom(firstDay)
所以 UI 通过加载获得 'stuck' 。
有什么想法吗?
您没有看到消费者来电的可能原因是 .subscribeOn(workScheduler)
。通过将此应用于 Subject
,它本身没有实际用途,因为在订阅 Subject
时没有订阅副作用,您可以延迟对 Subject
的订阅onNext
调用此时找不到任何观察者。
你可能想要的是这样的:
subject
.observeOn(resultScheduler) // <--------------- (1)
.doOnNext {
view.showLoading()
}
.observeOn(workScheduler) // <--------------- (2)
.map<List<UpcomingRowViewModel>> {
provider.calculateEventsBetween(
TimePeriod.aYearFrom(firstDay))
}
.observeOn(resultScheduler) // <--------------- (3)
.subscribe { upcomingRowViewModels ->
view.display(upcomingRowViewModels)
}
subject.onNext(TRIGGER)
而不是执行一次的 doOnSubscribe
,(1) 确保当有工作要做时,主题的 onNext 发射将触发主线程上的加载指示器(假设 resultScheduler 是 AndroidSchedulers.mainThread
在非测试中)。然后你想在主线程之外执行映射,因此 (2) 将项目移动到后台线程。映射完成后,结果项将再次移至主线程 (3),您的视图可以在其中显示它。