我正在使用 SingleLiveEvent 来传达我的 ViewModel 和我的活动。类似的东西(伪代码):
class MyActivity: BaseActivity{
fun onCreate(){
//Init viewmodel and so on
viewModel.commands.observe(this, { command ->
logger.debug("Command received","------>>>>>>>"+command.javaClass.simpleName)
processCommand(command)
})
}
}
我的 ViewModel 是这样的:
class MyViewModel(application: Application) : BaseAndroidViewModel(application) {
val command: SingleLiveEvent<CustomCommands> = SingleLiveEvent()
init{
loadOneThing()
command.postValue(CustomCommands.MessageCommand("one thing loaded"))
loadAnotherThing()
command.postValue(CustomCommands.MessageCommand("another thing loaded"))
}
}
我遇到的问题是 Activity 只接收最后一个命令,这是按照设计的。SingleLiveEvent 是来自 LiveData 的 Child 类,文档对 postValue 方法进行了以下说明:
* 如果您在主线程执行发布的任务之前多次调用此方法,则 * 只有最后一个值会被分派。
有趣的是,如果我在发布命令的行上设置断点,模拟器/设备/主线程有足够的时间来处理第一个命令,并且第二个命令也会被发送。但是在没有断点的情况下执行应用程序时,如果视图模型在命令之间执行的任务非常快(没有休息请求或类似的事情,但有一些计算),主线程没有足够的时间来完成第一个命令,并且第二个命令被忽略。
但我真的需要 View 来接收 ViewModel 发送的所有事件/命令。
我想 SingleLiveEvent 不是该用例的正确工具,LiveData 也不是,因为在设备旋转时重新发送已经消耗的事件等问题。
有人知道更好的方法来做到这一点吗?
提前致谢!