LiveData源码分析

news2025/7/27 11:57:59

先放整理流程图:

1.postValue调2次只触发1次?

postValue本质是把新值保存到LiveData的mPendingData成员变量里,版本号+1,把执行Runnable post到主线程,在主线程setValue。

多次调用会更新mPendingData的值,但Runnable已经post过了就不再post了。

2.粘性事件是怎么回事

参考文章开始的流程图,下面几种情况导致考虑调用回调(considerNotify):

  • setValue
  • postValue(最终调setValue)
  • 当生命周期状态变化时(observer通过装饰模式,被赋予了生命周期状态监听的能力)

considerNotify时:

  • 如果LifecycleOwner至少是START状态,则认为是活跃的
  • 如果observer的mLastVersion(默认为-1)大于新事件的版本号,则忽略

对于粘性事件,初始时设置了值,但是因为没有监听端,在setValue -> considerNotify时,值无法被消费,新注册了observer后,值才被消费。

3.可以在observer被回调时setValue?

可以。

分析见文章开始的流程图。

dispatchingValue方法虽然是单线程模型,但是做了对《在回调中setValue》的防护。

详细源码如下:

private void dispatchingValue(@Nullable ObserverWrapper initiator) {
    // 如果当前正在for循环中回调结果,则标记为“分发已刷新”状态,不再分发
    if (mDispatchingValue) {
        mDispatchInvalidated = true;
        return;
    }
    mDispatchingValue = true;
    do {
        mDispatchInvalidated = false;
        if (initiator != null) {
            considerNotify(initiator);
            initiator = null;
        } else {
            for (Iterator<Map.Entry<Observer<T>, ObserverWrapper>> iterator =
                mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
                considerNotify(iterator.next().getValue());
                // 如果处于“分发已刷新”状态,说明值改变了,需要break并重新执行do-while语句
                // 重新对所有observer进行结果回调
                if (mDispatchInvalidated) {
                    break;
                }
            }
        }
    } while (mDispatchInvalidated);
    mDispatchingValue = false;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/35317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

opencv的极线几何

一、理论介绍 当我们使用针孔相机拍摄图像时&#xff0c;我们会丢失一个重要的信息&#xff0c;即图像的深度。一个解决方案如我们的眼睛的方式使用两个相机&#xff08;两只眼睛&#xff09;&#xff0c;这就是所谓的立体视觉。 PO1O2为极平面&#xff0c;l1和l2为极线,e1和…

基于webrtc的数据传输研究总结

什么是webrtc WebRTC (Web Real-Time Communications) 是一项实时通讯技术&#xff0c;它允许网络应用或者站点&#xff0c;在不借助中间媒介的情况下&#xff0c;建立浏览器之间点对点&#xff08;Peer-to-Peer&#xff09;的连接&#xff0c;实现视频流和&#xff08;或&…

最新阿里云ECS服务器S6/C6/G6/N4/R6/sn2ne/sn1ne/se1ne处理器CPU性能详解

阿里云ECS服务器S6/C6/G6/N4/R6/sn2ne/sn1ne/se1ne处理器CPU性能怎么样&#xff1f;阿里云服务器优惠活动机型有云服务器S6、计算型C6、通用型G6、内存型R6、云服务器N4、云服务器sn2ne、云服务器sn1ne、云服务器se1ne处理器CPU性能详解及使用场景说明。 1、阿里云服务器活动机…

全局唯一ID

文章目录前言MongoDB ObjectIdTwitter SnowflakeUUID前言 基于数据库设置其实初始值&#xff0c;以及增量步长。基于ZK,Redis,改良雪花集中式服务生成&#xff0c;远程调用获取id。基于并行空间划分&#xff0c;Snowflake&#xff08;8Byte字节64bit位&#xff09;&#xff0c…

供应化学试剂mPEG-Azide,mPEG-N3,甲氧基-聚乙二醇-叠氮,CAS:89485-61-0

1、名称 英文&#xff1a;mPEG-Azide&#xff0c;mPEG-N3 中文&#xff1a;甲氧基-聚乙二醇-叠氮 2、CAS编号&#xff1a;89485-61-0 3、所属分类&#xff1a;Azide PEG Methoxy PEG 4、分子量&#xff1a;可定制&#xff0c;甲氧基-聚乙二醇-叠氮 5k、甲氧基-PEG-叠氮 10…

Higress 实战: 30行代码写一个 Wasm Go 插件

前言 在11月15号的直播 《Higress 开源背后的发展历程和上手 Demo 演示》中&#xff0c;为大家演示了 Higress 的 Wasm 插件如何面向 Ingress 资源进行配置生效&#xff0c;本文对当天的 Demo 进行一个回顾&#xff0c;并说明背后的原理机制。 本文中 Demo 运行的前提&#x…

PPOCR车牌定位模型推理后处理优化研究

综述 最近在研究基于PPOCR算法的车牌识别&#xff08;LPR&#xff09;&#xff0c;部署模型后发现之前关于OCR文本定位的后处理策略在车牌识别中存在定位精度不够高&#xff0c;文本框偏移的问题&#xff0c;如&#xff1a; 经分析发现是之前的OCR后处理策略存在一定局限&am…

java刷题day 03

选择题&#xff1a; 解析&#xff1a; 父类private的成员变量&#xff0c;根据权限修饰符的访问控制范围&#xff0c;只有在类内部才能被访问&#xff0c;就算是他的子类&#xff0c;也不能访问。这里如果将Person p new Child();改成 Person p new Person();代码依然无法通过…

乐趣国学—品读《弟子规》中的“余力学文”之道

文章目录余力学文不力行 但学文 长浮华 成何人但力行 不学文 任己见 昧理真读书法 有三到 心眼口 信皆要方读此 勿慕彼 此未终 彼勿起宽为限 紧用功 工夫到 滞塞通心有疑 随札记 就人问 求确义房室清 墙壁净 几案洁 笔砚正墨磨偏 心不端 字不敬 心先病列典籍 有定处 读看毕 还原…

信号完整性测试,关于SMA装配的细节,很多人都忽视了

作者 | 萧隐君&#xff0c;仿真秀专栏作者 SMA转接头是射频微波、天线和高速电路测试经常用到的一种连接器&#xff0c;应用非常广泛&#xff0c;种类也很多。在信号完整性的测试夹具中&#xff0c;2.92mm的SMA用的较多&#xff0c;它的带宽可以到40GHz&#xff0c;对于25Gbps…

【全网独家,收藏吧】10年全部《信息资源管理》真题整理,第2章 信息化规划与组织

文章目录&#x1f525; 11 年 4 月《信息资源管理》真卷选择题名词解释综合分析题&#x1f525; 11 年 7 月《信息资源管理》真卷选择题名词解释题简答题⭐ 12 年 4 月《信息资源管理》真卷选择题简答题⭐ 12 年 7 月《信息资源管理》真卷选择题简答题⭐ 13 年 4 月《信息资源管…

计算机网络--- 电子邮件

&#xff08;一&#xff09;电子邮件系统的组成 电子邮件是一种异步通信方式&#xff0c;通信时不需要双方同时在场。电子邮件把邮件发送到收件人使用的邮件服务器&#xff0c;并放在其中的收件人邮箱中&#xff0c;收件人可以随时上网到自己使用的邮件服务器进行读取。 一…

补盲激光雷达大爆发,各路产品谁领风骚?

11月伊始车载激光雷达赛道上演了冰火两重天的景象。国外Ouster与Velodyne LiDAR宣布合并以抱团取暖&#xff0c;主打OPA技术的Quanergy甚至股市停牌&#xff0c;一时风声鹤唳&#xff0c;寒意阵阵&#xff1b;而反观国内&#xff0c;禾赛、速腾、亮道相继发布纯固态补盲激光雷达…

龙格-库塔法(Runge-Kutta methods)

非线性的常微分方程通常是难以求出解析解的&#xff0c;只能通过多次迭代求近似的数值解。 龙格&#xff0d;库塔法&#xff08;Runge-Kutta methods&#xff09;是用于非线性常微分方程的解的重要的一类隐式或显式迭代法。简写做RK法。 对于任意的Yf(X),假设某点(Xi,Yi)的斜…

固定资产管理系统能帮助企业解决哪些问题?

固定资产管理系统是企业信息化转型中重要的工具之一。固定资产在企业整体资金和运营管理中的占比非同一般&#xff0c;因此企业管理者对固定资产的重视程度也逐渐提升。随着企业固定资产数量和种类的增多、人员的增多&#xff0c;以及分支机构和部门的增多&#xff0c;单纯依靠…

数据安全治理白皮书4.0(附下载link)

数据安全治理白皮书是国内最早的数据安全治理白皮书系列&#xff0c;围绕数据安全治理&#xff0c;“新理论、新技术、新实践”&#xff0c;一次系统汇总、梳理分析与集中呈现&#xff0c;2018年-2021年&#xff0c;已发布1.0/2.0/3.0三个版本&#xff0c;2022年&#xff0c;已…

LeetCode | 循环队列的爱情【恋爱法则——环游世界】

兜兜转转⚪还是你❤✒前言环形队列的概念拓展&#xff1a;生产者与消费者一、题目描述二、思路分析&#x1f351;初次遇见她♀【是心动的感觉】&#x1f351;阻碍一&#xff1a;队空还是队满不好区分【性格互异】&#x1f351;解决方案&#x1f351;阻碍二&#xff1a;很难获取…

Git之借助Commitizen规范化提交代码

文章目录一、约定式提交规范1.1 概述1.2 规范1.3 好处二、Commitizen2.1 安装2.2 安装并配置cz-customizable依赖2.2.1 安装依赖2.2.2 配置package.json2.2.3 添加cz-config配置文件2.3 使用2.4 问题一、约定式提交规范 1.1 概述 约定式提交规范是一种基于提交信息的轻量级约…

ES6 入门教程 26 编程风格 26.4 对象 26.5 数组 26.6 函数

ES6 入门教程 ECMAScript 6 入门 作者&#xff1a;阮一峰 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录ES6 入门教程26 编程风格26.4 对象26.5 数组26.6 函数26 编程风格 26.4 对象 单行定义的对象&#xff0c;最后一个成员不以逗号结尾。多…

流媒体传输 - RTSP 协议

概述 协议简介 RTSP RTSP (Real-Time Stream Protocol) 实时流传输协议是一种基于文本的应用层协议&#xff0c;常被用于 建立的控制媒体流的传输&#xff0c;该协议用于 C/S 模型 , 是一个 基于文本 的协议&#xff0c;用于在客户端和服务器端建立和协商实时流会话。 RTP …