作品分享
问答交流
发现
任务
客服工单
Jetpack 引入了 Lifecycle,让任何组件都能方便地感知界面生命周期的变革。只需实现 LifecycleEventObserver 接口并注册给生命周期对象即可。 LiveData 的数据观察者在内部被包装成另一个对象(实现了 LifecycleEventObserver 接口),它同时具备了数据观察本领和生命周期观察本领。
LiveData 的数据观察者通常是匿名内部类,它持有界面的引用,大概造成内存泄漏。 LiveData 内部会将数据观察者举行封装,使其具备生命周期感知本领。当生命周期状态为 DESTROYED 时,自动移除观察者。
LiveData 的值被存储在内部的字段中,直到有更新的值覆盖,以是值是长期的。 两种场景下 LiveData 会将存储的值分发给观察者。一是值被更新,此时会遍历全部观察者并分发之。二是新增观察者或观察者生命周期发生变革(至少为 STARTED),此时只会给单个观察者分发值。 LiveData 的观察者会维护一个“值的版本号”,用于判定前次分发的值是否是最新值。该值的初始值是-1,每次更新 LiveData 值都会让版本号自增。 LiveData 并不会无条件地将值分发给观察者,在分发之前会履历三道坎:1. 数据观察者是否活泼。2. 数据观察者绑定的生命周期组件是否活泼。3. 数据观察者的版本号是否是最新的。 “新观察者”被“老值”关照的征象叫“粘性”。因为新观察者的版本号总是小于最新版号,且添加观察者时会触发一次老值的分发。
在高频数据更新的场景下使用 LiveData.postValue() 时,会造成数据丢失。因为“设值”和“分发值”是分开实行的,之间存在延长。值先被缓存在变量中,再向主线程抛一个分发值的任务。若在这延长之间再一次调用 postValue(),则变量中缓存的值被更新,之前的值在没有被分发之前就被擦除了。
在 Fragment 中观察 LiveData 时使用viewLifecycleOwner而不是this。因为 Fragment 和 此中的 View 生命周期不完全划一。LiveData 内部判定生命周期为 DESTROYED 时,才会移除数据观察者。存在一种情况,当 Fragment 之间切换时,被更换的 Fragment 不实行 onDestroy(),当它再次展示时会再次订阅 LiveData,于是乎就多出一个订阅者。
androidx.lifecycle.Transformations类提供了三个变更 LiveData 数据的方法,最常用的是 Transformations.map(),它使用MediatorLiveData作为数据的中间斲丧者,并将变更后的数据通报给终极斲丧者。须要注意的是,数据变革操纵都发生在主线程,主线程有大概被耗时操纵壅闭。办理方案是将 LiveData 数据变更操纵异步化,比如通过CoroutineLiveData。
举报
本版积分规则 回帖后跳转到最后一页
Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )
GMT+8, 2025-8-8 23:05, Processed in 0.157138 second(s), 32 queries.© 2003-2025 cbk Team.