首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android LiveData事件序列保证?

Android LiveData事件序列保证?
EN

Stack Overflow用户
提问于 2019-05-23 06:22:24
回答 1查看 336关注 0票数 0

我的代码片段中有以下代码,用于订阅视图模型的LiveData事件。

代码语言:javascript
复制
    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的值,然后在视图模型中发布一个exitRequestedEvent的值,如下所示:

代码语言:javascript
复制
// yay my thing happened successfully, emit events
successfullyAddedEvent.postValue(Event(contentAdded))
exitRequestedEvent.postValue(Event(ExitReason.AddSuccessful))

是否可以保证在退出此片段之前处理add事件(设置共享结果ViewModel上的结果),以便调用片段始终有结果?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-23 06:32:52

根据documentation的说法,postValue只是意味着如果你不在主线程上,就把任务发送到主线程,所以除非你的代码中也有setValue,否则顺序应该是有保证的。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56265739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档