为什么设置LiveData观察者之前修改值,观察者依然会触发执行?
问题解答
你对LiveData的运行机制确实存在误解,该运行结果符合LiveData的设计预期。
- LiveData是粘性观察者组件,默认会缓存当前持有的最新值。只要新注册的观察者绑定的生命周期所有者进入活跃状态(STARTED及以上),LiveData就会主动把缓存的最新值推送给该观察者,无论这个值是在观察者注册之前还是之后更新的。
- 你的代码中先执行了
testViewModel.testLiveData.value = true,此时LiveData已经缓存了true这个值,后续注册观察者后,当Activity生命周期走到STARTED状态时,观察者就会收到这个缓存值,因此触发了打印逻辑。
如果你需要实现「仅接收观察者注册之后发生的数值变更」的非粘性效果,可通过以下方式实现:
- 封装自定义非粘性LiveData,内部新增事件消费标记,保证每个事件仅会推送给注册完成后产生的观察者
- 直接使用Jetpack官方示例中提供的
SingleLiveEvent类,适配单次通知的业务场景
内容的提问来源于stack exchange,提问作者azzyjk
相关产品推荐
相关产品推荐

