Android JetPack~LiveData(二) 数据倒灌问题 焦点速递
时间:2023-05-02 21:36:46
来源:博客园
(相关资料图)
Android数据绑定技术一,企业级开发Android数据绑定技术二,企业级开发Android JetPack~ DataBinding(数据绑定)(一) 集成与使用Android JetPack~ LiveData (一) 介绍与使用Android JetPack~LiveData(二) 数据倒灌问题Android JetPack~ ViewModel (一) 介绍与使用1、数据倒灌的出现场景:如果我们在一个home页面获取网络数据,然后通过LiveData的观察者特性,在回调中跳转B页面,当旋转屏幕时,页面重建,LiveData又发来最后一次数据,那么直接触发了跳转B页面的代码。这就是数据倒灌引起的问题。因为LiveData的数据会保存在内存中。
数据倒灌原因:个人描述:我们都知道LiveData是一个观察者模式,被观察者只要改变了观察者会收到通知。在页面重建时,LiveData自动推送最后一次数据供我们使用。官方描述:ViewModel 将数据保留在内存中,这意味着开销要低于从磁盘或网络检索数据。ViewModel 与一个 Activity(或其他某个生命周期所有者)相关联,在配置更改期间保留在内存中,系统会自动将 ViewModel 与发生配置更改后产生的新 Activity 实例相关联。在分发事件的时会先判断mVersion和mLastVersion,当mLastVersion < mVersion时会onChanged((T) mData);进行分发。每次设置setValue时mVersion++,然后赋值给mLastVersion。private abstract class ObserverWrapper { final Observer super T> mObserver; boolean mActive; // 第一处 int mLastVersion = START_VERSION;} private void considerNotify(ObserverWrapper observer) { ... // 第二处 if (observer.mLastVersion >= mVersion) { return; } // 第三处 observer.mLastVersion = mVersion; observer.mObserver.onChanged((T) mData); }
从上面实验结果可知,屏幕旋转前,observer.mLastVersion == mVersion ==2。但是屏幕旋转后,mLastVersion的值却变成了-1。这里就是问题所在了。倒灌原因小结Activity异常销毁然后重建,ViewModel会保存销毁之前的数据,然后在Activity重建完成后进行数据恢复,所以LiveData成员变量中的mVersion会恢复到重建之前的值。但是Activity重建后会调用LiveData的observe()方法,方法内部会重新new一个实例,会将mLastVersion恢复到初始值。由于LiveData本身的特性,Activity的生命周期由非活跃变成活跃时,LiveData会触发事件分发,导致屏幕旋转或者切换系统语言后出现数据倒灌。注意但是这里有一点要非常注意:系统内存不足,杀到应用后台,也会导致Activity重建,但是不会LiveData导致数据倒灌。问题找到了,那如何防止数据倒灌呢?解决办法再来回顾下,数据倒灌的常见方式:屏幕旋转用户手动切换系统语言方案:如果应用不需要横屏,就设置为永久竖屏。如果当前Activity回到前台LiveData不需要接收最新的数据,可以使用下面三中扩展的LiveData官方扩展的SingleLiveEvent美团反射修改mVersionUnPeek-LiveData设置android:configChanges="orientation|screenSize",这样普通生命周期就不走了待续。。。。。
标签:
- Android JetPack~LiveData(二) 数据倒灌问题 焦点速递
- 世界热讯:梨子与什么食物相克
- 深圳 10 天拿出近 3 亿补贴这个行业,销售称 5 月才是真正的战斗-今日快讯
- 六年级方程题100道含答案算式 六年级方程题100道
- 全球速看:大家乐集团(00341.HK)发盈喜 预期年度股东应占溢利增至1.05亿至1.15亿港元
- 天天播报:30000次敲击换来3分钟的平安
- 环球速读:西安长城数字软件有限公司-长城软件的客服电话多少啊
- 室内喜阴的大型绿植_家庭室内绿植什么品种好
- 南宁有几个区域图_南宁有几个区_时快讯
- 2023年东海海区伏季休渔专项执法行动在福州启动|天天热资讯
- 享道出行:今年五一前半程订单量同比2021年日均增幅超200%
- 报道:9472米!我国开钻亚洲最深油气井
- 每日短讯:美的盛宴目不暇给
- 泉州港石狮航运中心一期工程竣工
- 天天热门:高校劳动教育已广泛开展,还需关注哪些新问题?
- 乌克兰总统向最高拉达提交延长战时状态和全民动员的法案
- 曲终人散_对于曲终人散简单介绍_全球速读
- 世界快讯:学海风暴七年级上册数学答案电子版 学海风暴七年级上册数学答案
- 小托马斯:詹姆斯可以说是GOAT 38岁的他就像32岁 仍是最高水平-全球讯息
- 天天观察:合作共赢!经开区与交通银行淮安分行达成战略合作
- 入库单会计分录怎么做_其他入库单会计分录
- 全球新资讯:三鲜馅饺子馅的做法和配料_三鲜馅饺子馅的做法
- 速读:学校的固定资产包括哪些内容 固定资产包括哪些内容
- osars综合征呼吸暂停_osa-天天百事通
- 动物园猩猩用石头砸游客园方回应-世界快消息
- 知名景区“霸气”公告!看不到景观全额退款_环球资讯
- 城管工作存在问题和不足(工作存在问题和不足)
- 世界热文:让景于客!蚌埠市发布倡议
- 最新通知!事关职称申报
- 五粮液收入、利润增速垫底“茅五泸洋汾”,曾从钦压力山大?_焦点播报
x
广告
x
广告