Android LiveData事件顺序保证?
Android LiveData event sequence guarantees?
我的 Fragment 中有以下代码,订阅了我的 ViewModel 的 LiveData 事件。
viewModel.successfullyAddedEvent.observeEvent(this){
// do result handling by shared view model to the calling fragment
result.successfullyAddedEvent.postValue(Event(it))
findNavController().navigateUp()
}
viewModel.successfullyEditedEvent.observeEvent(this){
// do result handling by shared view model to the calling fragment
result.successfullyEditedEvent.postValue(Event(it))
findNavController().navigateUp()
}
viewModel.exitRequestedEvent.observeEvent(this){
when(it){
ExitReason.GetDetailsFailed -> {
Toast.makeText(context, R.string.details_load_error, LENGTH_SHORT).show()
}
ExitReason.UserCanceled -> { /* happy path */ }
}
findNavController().navigateUp()
}
我在这段代码中调用了三个地方 navigateUp
,我想稍微统一一下导航。
从每个案例(成功添加、成功编辑、错误案例、用户取消)发出 ExitRequestedEvent
并从这些事件中删除对 navigateUp
的调用似乎是一种代码改进,但我不确定收货订单的保证。也就是说,如果我要为 successfullyAddedEvent
设置 post 值,然后在我的视图模型中设置 exitRequestedEvent
值,如下所示:
// yay my thing happened successfully, emit events
successfullyAddedEvent.postValue(Event(contentAdded))
exitRequestedEvent.postValue(Event(ExitReason.AddSuccessful))
我能否保证在退出此片段之前处理添加事件(在共享结果 ViewModel 上设置结果),以便调用片段始终有结果?
根据 documentation,postValue
只是意味着如果您不在主线程上,则将任务发布到主线程,所以除非您的代码中也有 setValue
,订单应该得到保证。
如果你想绝对保证顺序(即使没有必要),你可以使用setValue()
,但你必须确保它发生在主线程上。
我的 Fragment 中有以下代码,订阅了我的 ViewModel 的 LiveData 事件。
viewModel.successfullyAddedEvent.observeEvent(this){
// do result handling by shared view model to the calling fragment
result.successfullyAddedEvent.postValue(Event(it))
findNavController().navigateUp()
}
viewModel.successfullyEditedEvent.observeEvent(this){
// do result handling by shared view model to the calling fragment
result.successfullyEditedEvent.postValue(Event(it))
findNavController().navigateUp()
}
viewModel.exitRequestedEvent.observeEvent(this){
when(it){
ExitReason.GetDetailsFailed -> {
Toast.makeText(context, R.string.details_load_error, LENGTH_SHORT).show()
}
ExitReason.UserCanceled -> { /* happy path */ }
}
findNavController().navigateUp()
}
我在这段代码中调用了三个地方 navigateUp
,我想稍微统一一下导航。
从每个案例(成功添加、成功编辑、错误案例、用户取消)发出 ExitRequestedEvent
并从这些事件中删除对 navigateUp
的调用似乎是一种代码改进,但我不确定收货订单的保证。也就是说,如果我要为 successfullyAddedEvent
设置 post 值,然后在我的视图模型中设置 exitRequestedEvent
值,如下所示:
// yay my thing happened successfully, emit events
successfullyAddedEvent.postValue(Event(contentAdded))
exitRequestedEvent.postValue(Event(ExitReason.AddSuccessful))
我能否保证在退出此片段之前处理添加事件(在共享结果 ViewModel 上设置结果),以便调用片段始终有结果?
根据 documentation,postValue
只是意味着如果您不在主线程上,则将任务发布到主线程,所以除非您的代码中也有 setValue
,订单应该得到保证。
如果你想绝对保证顺序(即使没有必要),你可以使用setValue()
,但你必须确保它发生在主线程上。