代码之家  ›  专栏  ›  技术社区  ›  Jon O

Android LiveData事件序列保证?

  •  0
  • Jon O  · 技术社区  · 6 年前

    我的片段中有以下代码,订阅了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 从每个案例(成功添加、成功编辑、错误案例、用户取消)中删除对 导航 从那些事件中,但我不确定收到订单的保证。也就是说,如果我发布 successfullyAddedEvent 然后一个 exitRequestedEvent 在我的视图模型中,如下所示:

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

    我能保证在退出这个片段之前,我会处理添加事件(它将结果设置在共享结果视图模型上),这样调用片段总是有结果吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Jack    6 年前

    根据 documentation , postValue 意思是如果你不在主线程上,就把任务发布到主线程上,所以除非你有 setValue 在代码中的某个地方,顺序也应该得到保证。

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