不贴代码能说明白Jetpack LiveData原理吗(一)

2023-11-01

LifecycleOwner如何提供周期生命周期的变化?

LifecycleObserver如何得知生命周期的变化?

LiveData的背后隐藏了多少不为人知的秘密?

这一切都要从观察者模式说起…

起源

何为观察者模式,在代码中最直接的表现就是在事件发生之前,向事件管理者注册回调,通常是让事件管理者持有自己的引用,并且是以接口的形式。

LiveData的作用是持有数据,并在正确的时机,将数据分发给所有观察LiveDataObserver对象,这不就是观察者模式吗,但更为有趣的是,当这个观察者具有生命周期的属性时,他会存在某些时刻不想观察LiveData数据的变化,在某个时刻又想要知道LiveData持有的最新数据,这个Observer可能存活于ActivityFragment中,朝生夕死,也可能它就是Activity或fragment本身。

暗中观察

在这里插入图片描述

于是在LiveData的内部,观察者以ObserverWrapper的形式,将具有生命周期的LifeCycleOwnerObserver封装到了一起,Observer也可以是Lifecycleowner本身,Lifecycleowner通常是Activity或Fragment。

Observer由开发者负责实现Observer接口,用来让Livedata通知Observer关于持有的data的变化,而包装后的ObserverWrapper对象内部实现了LifecycleObserver接口,这样ObserverWrapper既能观察lifecycleowner的生命周期的变化,又能观察Livedata持有的的数据变化。

换句话说,在owner的生命周期发生变化或者Livedata持有的数据发生变化时,wrapper对象都可以从对应的接口收到最新数据的通知;

那接下来的事情,就是处理何时将这些变化发送到wrapper对象,wrapper对象再根据特定条件将通知分发给真正的Observer对象;大胆猜想一下,这个特定条件就是owner的生命周期状态。

Livedata根据owner的生命周期状态来分发最新数据到Observer的onChange方法中。

ObserveronChange方法会在什么时候收到通知?

1.当Livedata postvaluesetValue时,会遍历Livedata保存的所有ObserverWrapper,决定是否要通知他LiveData持有的最新数据,非active状态或Observer的数据已是最新版本就不通知;active状态至少是owner的STARTED状态 。

2.当ObserveLifecycleObserver接口收到owner生命周期变化的通知时,也会根据一些特定条件,如是否变为active状态,来决定是否将Livedata的最新数据通知给自己,也就是主动去获取LiveData的最新数据。

LiveData如何避免Activity内存泄漏?

观察者模式中,LiveData作为数据持有者,势必要持有Observer的引用,才可以发送数据,为了让Observer具有生命周期属性,ObserverLifecycleOwner又被LiveData内部的ObserverWrapper绑定到了一起,那么LiveData最终间接持有了Activity的引用,LifecycleOwner通常是Activity或者Fragment。

为了避免内存泄漏和非必要的数据更新,自然要利用观察到的owner的生命周期,在Activity 销毁时,从保存Observer和对应warpper的Map集合中,及时remove 掉ObserverLifycleOwner的引用。

一句话总结

用LvieData源码中的注释总结就是

LiveData is a data holder class that can be observed within a given lifecycle.

精辟

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不贴代码能说明白Jetpack LiveData原理吗(一) 的相关文章

随机推荐

  • Unity中UI框架的使用3-主界面中的弹窗和关闭

    效果图 在主页面点击排位赛按钮 就会弹出图2中的一个弹窗 再点击弹窗右上角的关闭按钮 就会关闭弹窗 回到图3的效果 方法 1 将PopUp这个面板添加到UIPanelType cs文件中 并且将其名称和路径添加到UIPanelType js
  • Python高级函数1:使用 map()、reduce()、filter()、zip() 和 enumerate() 简化代码

    Python高级函数1 使用 map reduce filter zip和 enumerate 简化代码 1 原理 1 1 map 函数 1 2 reduce 函数 1 3 filter 函数 1 4 zip 函数 1 5 enumerat
  • 在分布式环境下标准支付流程的梳理

    支付流程图的梳理 https www processon com diagraming 61a18a895653bb136f893ecc 提交订单 当用户点击立即购买或者提交订单的这个时候数据库就会记录一笔订单 此项业务主要是用到了rabb
  • Android 设置ListView不可滚动 及在ScrollView中不可滚动的设置

    转载请注明出处 http blog csdn net androiddevelop article details 38815493 希望得到的效果是ListView不能滚动 但是最大的问题在与ListView Item还必有点击事件 如果
  • 2023华为OD机试真题【区间交叠/贪心算法】【Python Java C++】

    题目描述 给定坐标轴上的一组线段 线段的起点和终点均为整数并且长度不小于1 请你从中找到最少数量的线段 这些线段可以覆盖住所有线段 输入描述 第一行输入为所有线段的数量 不超过10000 后面每行表示一条线段 格式为 x y x和y 分别表
  • vscode因网络下载失败的问题

    复制出失败的下载链接 https az764295 vo msecnd net stable d045a5eda657f4d7b676dedbfa7aab8207f8a075 VSCodeUserSetup x64 1 72 2 exe 将
  • 多任务视频推荐方案,百度工程师实战经验分享

    推荐系统的应用场景非常广泛 比如非常火爆的短视频推荐 电商平台商品推荐 搜索推荐等 但是你知道吗 短视频APP在向你展示一个你感兴趣的视频之前 通常既要预测你对这个视频是否感兴趣 又要预测你会看多久 点赞还是不点赞 会不会偷偷收藏起来下次接
  • 迁移学习matlab

    迁移学习是一种机器学习技术 它可以利用已有的模型和数据来加速新模型的训练 在Matlab中实现迁移学习 需要先选定一个预训练的模型 然后使用该模型的权重来初始化新模型 最后对新模型进行微调以适应特定的任务 Matlab中有一些已经预先训练好
  • 常用函数式接口

    常用函数式接口 JDK 8 中重要的函数接口 接口 参数 返回 中文 示例 Supplier None T 提供者 工厂方法创建对象 Consumer T void 消费者 输出一个值 Predicate T boolean 谓语 顾名思义
  • 【Linux】编译器gcc和g++与调试器gdb的使用

    文章目录 一 Linux编译器 gcc g 1 程序运行的四个阶段 1 1 预处理 1 2 编译 1 3 汇编 1 4 链接 2 链接方式与函数库 2 1 动态链接与静态链接 2 2 动态库与静态库 3 gcc g 的使用 二 Linux调
  • C++11容器中新增加的emplace相关函数的使用

    C 11中 针对顺序容器 如vector deque list 新标准引入了三个新成员 emplace front emplace和emplace back 这些操作构造而不是拷贝元素 这些操作分别对应push front insert和p
  • Spark一路火花带闪电——Spark底层原理介绍

    文章目录 Spark计算引擎原理 1 1 术语 1 1 1 Application Spark应用程序 1 1 2 Driver 驱动程序 1 1 3 Cluster Manager 资源管理器 1 1 4 Executor 执行器 1 1
  • python---闭包

    1 闭包理解 闭包定义 在函数嵌套的前提下 内部函数使用了外部函数的变量 并且外部函数返回了内部函数 我们把这个使用外部函数变量的内部函数称为闭包 2 必报的构成条件 在函数嵌套 函数里面在定义函数 的前提下 内部函数使用了外部函数的变量
  • 【Kaggle】【Output创建文件夹时“nameError: name ‘mkdir‘ is not defined”】

    文章目录 问题描述 解决方法 Reference 问题描述 想要手动设置Output的文件夹 便于结果保存及分类保存等 在一个cell中输入图2的命令 出现报错 解决方法 cell中不能有多余的东西 一句命令对应一个cell 多余的即使注释
  • 什么是ChatGPT?如何与ChatGPT高效交流?

    ChatGPT是一种基于语言模型的对话系统 由OpenAI开发 它建立在GPT Generative Pre trained Transformer 模型的基础上 在大规模语料库上进行了预训练 并通过与人类进行交互式对话来进行微调 一 什么
  • Python爬虫学多久才能接单?

    要学多久才能掌握爬虫技能并能够接单 这个因人而异 取决于学习的方式 时间和个人天赋 以下是一些学习建议 1 了解基础知识 在开始爬虫之前 确保您对HTML CSS JavaScript以及HTTP等基础编程和网络技术有所了解 2 学习编程语
  • 叶荣添给你的11条投机建议!

    一 刚则易折 至阴至柔是王道 凡事不可勉强股票也一样要学会知难而退 善于变化 既然大的趋势确定了就不必急于一时的涨跌 二 退却不代表放弃 暂时的放弃不代表今生不再回头 此句意味善于止损 在股票操作里风险第一 盈利第二 在操作交易的过程中永远
  • Qt中的窗口类

    文章目录 1 QWidget 1 QWidget 2 QDialog 2 1 QMessageBox 2 2 QFileDialog 2 3 QFontDialog 2 4 QColorDialog 2 5 QInputDialog 2 6
  • 三星被曝因ChatGPT泄露芯片机密!韩媒惊呼数据「原封不动」直传美国,软银已禁止员工使用......

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 点击进入 gt 计算机视觉 微信技术交流群 明敏 萧箫 发自 凹非寺转载自 量子位 QbitAI 三星引入ChatGPT不到20天 就发生3起数据外泄事件 其中2次和半
  • 不贴代码能说明白Jetpack LiveData原理吗(一)

    LifecycleOwner如何提供周期生命周期的变化 LifecycleObserver如何得知生命周期的变化 LiveData的背后隐藏了多少不为人知的秘密 这一切都要从观察者模式说起 起源 何为观察者模式 在代码中最直接的表现就是在事