Android: Transformations.switchMap 快速调用时未触发
Android: Transformations.switchMap not triggered when quick call
我正在尝试学习 MVI。我正在更新转换开关映射正在观察的状态事件实时数据。这是在我的视图模型中。
fun setStateEvent(event: StateEvent) {
Timber.d("SetStateEvent: [$event]")
_stateEvent.value = event
}
val dataState: LiveData<DataState<CustomViewState>> = Transformations.switchMap(_stateEvent) { stateEvent ->
Timber.d("Got state event [$stateEvent]")
stateEvent?.let {
handleStateEvent(it)
}
}
现在在我看来,我正在尝试执行两个操作:
viewmodel.setStateEvent(CustomStateEvent.ActionOne())
viewmodel.setStateEvent(CustomStateEvent.ActionTwo())
这些是我的日志:
SetStateEvent: [CustomStateEvent$ActionOne]
SetStateEvent: [CustomStateEvent$ActionTwo]
Got state event [CustomStateEvent$ActionTwo]
...
出于某种原因,第一个正在获得 cancelled/ignored。我做错了什么?
LiveData
是一个状态持有者,它就是为这个目的而设计的。所以它保证了所有活跃的(其状态至少为STARTED
)的观察者最终都会收到这个LiveData
的最新值,但是所有的中间值都可以合并。如果您需要在不混淆的情况下传递所有发布的值,您应该使用另一个抽象 - 例如 kotlin channel.
我正在尝试学习 MVI。我正在更新转换开关映射正在观察的状态事件实时数据。这是在我的视图模型中。
fun setStateEvent(event: StateEvent) {
Timber.d("SetStateEvent: [$event]")
_stateEvent.value = event
}
val dataState: LiveData<DataState<CustomViewState>> = Transformations.switchMap(_stateEvent) { stateEvent ->
Timber.d("Got state event [$stateEvent]")
stateEvent?.let {
handleStateEvent(it)
}
}
现在在我看来,我正在尝试执行两个操作:
viewmodel.setStateEvent(CustomStateEvent.ActionOne())
viewmodel.setStateEvent(CustomStateEvent.ActionTwo())
这些是我的日志:
SetStateEvent: [CustomStateEvent$ActionOne]
SetStateEvent: [CustomStateEvent$ActionTwo]
Got state event [CustomStateEvent$ActionTwo]
...
出于某种原因,第一个正在获得 cancelled/ignored。我做错了什么?
LiveData
是一个状态持有者,它就是为这个目的而设计的。所以它保证了所有活跃的(其状态至少为STARTED
)的观察者最终都会收到这个LiveData
的最新值,但是所有的中间值都可以合并。如果您需要在不混淆的情况下传递所有发布的值,您应该使用另一个抽象 - 例如 kotlin channel.