Android LiveData事件序列保证?

时间:2019-05-22 22:22:24

标签: android android-livedata android-viewmodel android-mvvm

我的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()
    }

在这段代码中,我有3个地方叫navigateUp,我想稍微统一一下导航。

从每种情况(成功添加,成功编辑,错误情况,用户取消)发出ExitRequestedEvent并从这些事件中删除对navigateUp的调用似乎是对代码的改进。我不确定收货单上的担保。也就是说,如果我要在视图模型中发布successfullyAddedEvent然后是exitRequestedEvent的值,如下所示:

// yay my thing happened successfully, emit events
successfullyAddedEvent.postValue(Event(contentAdded))
exitRequestedEvent.postValue(Event(ExitReason.AddSuccessful))

我可以保证在退出该片段之前会处理add事件(将结果设置在共享结果ViewModel上),以便调用片段始终有结果吗?

1 个答案:

答案 0 :(得分:1)

根据documentationpostValue仅表示将任务发布到主线程(如果不在线程上),因此,除非代码中也有setValue,否则顺序应该得到保证。

如果您想绝对保证顺序(即使不是必需的),则可以使用setValue(),但是必须确保它在主线程上发生。