码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Android JetPack~LiveData(二) 数据倒灌问题


    1. Android数据绑定技术一,企业级开发
    2. Android数据绑定技术二,企业级开发
    3. Android  JetPack~ DataBinding(数据绑定)(一)    集成与使用
    4. Android  JetPack~ LiveData (一)   介绍与使用
    5. Android JetPack~LiveData(二) 数据倒灌问题
    6. 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 Observersuper 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
      • 美团反射修改mVersion
      • UnPeek-LiveData
    • 设置android:configChanges="orientation|screenSize",这样普通生命周期就不走了

     

    待续。。。。。

     

     

     

  • 相关阅读:
    Day02-数据绑定
    C# 第六章『交互式图形界面』◆第1节:Form窗体—介绍
    css+ html 模仿哔哩哔哩页面
    Shiro与web的整合
    vue3 webpack打包流程及安装 (1)
    PG14归档失败解决办法archiver failed on wal_lsn
    电子支付市场现状研究:预计2022年业务量将增长至3141亿元
    数据卷(Data Volumes)&dockerfile
    6.1_4 Python3.x入门 P4 【基础】可变序列(列表list、字典dict、集合set)
    程序员是做什么的?怎么成为程序员?
  • 原文地址:https://www.cnblogs.com/cmusketeer/p/17368277.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号