Jetpack02-LiveData 数据驱动UI更新(类似EventBus)

前提

LiveData使用了Lifecycle的生命周期,阅读本文前,请先了解Lifecycle源码。

简介

LiveData本质是数据类型,当改变数据的时候,会通知观察者,且只在界面可见的时候才会通知观察者。只能在主线程注册观察者,一般用于更新UI。

具有生命周期属性,生命周期属性来源于Lifecycle的功能。

具有数据粘性,先改变数据,再注册观察者,能收到上一次数据的改变。

使用

普通使用

界面TextView先被改为“我是info1”,1s后改为“在子线程中修改info1”。

界面可见才接收数据

只有在界面可见的时候,观察者才接收数据,中间数据会被丢弃。

执行结果:

先修改数据,后添加观察者,能收到最后一个修改的数据

数据粘性,先修改LiveData数据,再给LiveData添加观察者,该观察者能接收到LiveData最后一次修改的数据。

运行结果:

如何去除粘性?

hook反射 动态修改源码,去除粘性。

源码分析

相关类有LiveData和MutableLiveData,LiveData是抽象类,核心代码在此类中实现。MutableLiveData类是提供给用户使用的,提供修改数据方法。

订阅观察者

订阅观察者的时候,要传入LifecycleOwner对象和Observer对象,在Lifecycle源码分析时,可知LifecycleOwner对象就是Activity。

订阅观察者的时候做了两件事情。

创建Lifecycle的观察者LifecycleBoundObserver,并注册。

存储LiveData观察者用于通知。

修改LiveData数据的时候,如何通知观察者?

主线程修改LiveData数据

主线程修改LiveData数据通知观察者流程,整个过程都在主线程中执行。

子线程修改LiveData数据

子线程修改LiveData数据的时候,首先要使用锁保证value的正确,然后使用Handler切换至主线程,使用主线程修改LiveData数据的方法setValue修改数据。

粘性原理

除了上述流程外,因为使用Lifecycle监听了Activity的生命周期,那么当生命周期回调的时候做了哪些事情?

在订阅观察者的时候,可知Lifecycle的观察者是LifecycleBoundObserver,来监听Activity的生命周期变化。

查看下LifecycleBoundObserver源码如下:

如何去除粘性,使用Hook修改LiveData观察者(ObserverWrapper)的版本和LiveData类的版本(mVersion)相等即可。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebRTC编译后替换libwebrtc.aar时提示找不到libjingle_peerconnection_so.so库

Loading native library: jingle_peerconnection_so 问题原因:编译的时候只编译了armeabi-v7a的版本,但是应用程序是arm64-v8a,所以无法运行 解决方法:更新编译脚本,加上arm64-v8a进行编译 ./tools_webrtc/android/bu…

【Docker】如何让docker容器正常使用nvidia显卡

首先确保宿主机正常安装了显卡驱动 nvidia-smi打印显卡信息如下: 安装nvidia-container-toolkit工具 sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit sudo systemctl restart docker运行如下命令测试显卡是否在容器内可用 …

Maya学习笔记:物体的层级关系

文章目录 父子关系设置父子关系同时显示两个大纲视图 组 父子关系 设置父子关系 设置父子物体: 方法1 先选择子物体,按住shift再选中父物体,按P或者G键 方法2 在大纲视图中按住鼠标中间,拖动一个物体到另一个物体上 取消父子关…

TON生态系统开发指南:从零开始构建你的Web3应用

随着Web3的不断发展,TON(The Open Network)生态系统逐渐成为备受瞩目的区块链平台。依托其与Telegram的深度整合,TON生态为开发者提供了一个极具潜力的开发环境,特别是在社交、支付和金融这三个核心领域。本文旨在帮助…

基于STM32的Zeta型数控电源设计

本设计基于STM32F103C6T6为主控芯片,基于Zeta型DC/DC电源的拓扑结构设计一种数控电源。系统包含单片机主控模块、Zeta型升降压模块、驱动模块、电流采样模块、电压采样模块、OLED显示模块、电源模块及按键模块。用电流采样模块采集电流,电压采样模块采集…

【图灵完备 Turing Complete】游戏经验攻略分享 Part.5 编程

编程部分的话,第一关会让你输入机器码,这一章节还是比较简单的,因为操作码是固定给出的,只需要根据题意去编写,完成这章目的是为了解锁下面的关卡。 输入,移动COPY之后进行运算,然后输出。 激光…

【MySql】在ubuntu下安装MySql数据库

目录 查看操作系统版本 添加 MySql APT源 访问下载页面并下载发布包 安装发布包 执行安装命令 从MySql APT源更新包信息 安装MySql 执行安装命令 查看MySql状态 开启自启动 登录MySql 查看操作系统版本 rootVM-24-2-ubuntu:~# lsb_release -a No LSB modules are ava…

stm32 的UART串口波特率115200bps,一秒钟能发多少个数据包,实测给出结论

问题描述 之前觉得串口波特率115200bps,算下来115.2kbps,一秒钟发1k个数据包很容易就实现。 但是实际应用的时候,就发现不一样了。 每个数据包格式如下: 16进制:0A 55 55 00 0D 0A 55 06 24 05 4C 05 5F 05 CE 05 …

AR传送门+特定区域显示内容+放大镜 效果着色器使用

AR传送门特定区域显示内容放大镜 效果 关键词:Portal Mask 1、教程链接: AR 传送门教程 Unity - Portal Mask Implementation - Part 4_哔哩哔哩_bilibili 应用案例效果: 2、案例下载地址:使用unity 2021.3.33f1 obi 工具…

vue echarts tooltip动态绑定模板,并且处理vue事件绑定

先上代码: tooltip: {// 这里是车辆iconshow: true,// trigger: "item",// backgroundColor: "transparent",appendToBody: true,textStyle: {color: "#ffffff" //设置文字颜色},formatter: (params) > {const TruckTooltip Vue.…

全新热门电商API接口,实现闲鱼商品详细搜索功能

近年来,电商行业蓬勃发展,API(Application Programming Interface)接口已经成为电商平台的重要组成部分。API接口不仅可以实现平台间的数据交互,还可以为开发者提供丰富的功能,满足用户多样化的需求。在这个…

嵌入式算吃青春饭么?

嵌入式系统开发并不是传统意义上的“吃青春饭”的行业。这个领域更侧重于技术深度、专业能力和持续学习的态度,而非仅仅依赖于年龄或体力。 嵌入式系统广泛应用于各种设备和系统中,从智能手机、智能家居到工业自动化、医疗设备、汽车电子等,…

Streamlit:使用 Python 快速开发 Web 应用

一、简单介绍 Streamlit 是一个开源 Python 库,官网地址: https://streamlit.io/http://StreamlitStreamlit 是一个开源的 Python 框架,旨在为数据科学家和 后端工程师们提供只需几行代码即可创建动态数据应用的功能。 让没有任何前端基础…

Linux CentsOS定时删除一个目录下(包含子目录)的改动时间大于12小时的文件

Shell脚本 文件目录如下图 ** 查找/ai/img/目录下的所有文件** find /ai/img/ -type f查找/ai/img/目录下的所有上次改动时间大于720分钟(12小时)的文件 12 小时,也就是 720 分钟。所以,我们可以使用 -mmin 720 来查找修改时间超过 720 分钟(…

前端报错401 【已解决】

前端报错401 【已解决】 在前端开发中,HTTP状态码401(Unauthorized)是一个常见的错误,它表明用户试图访问受保护的资源,但未能提供有效的身份验证信息。这个错误不仅关乎用户体验,也直接关系到应用的安全性…

成都睿明智科技有限公司可靠吗?

在这个短视频风靡的时代,抖音已不仅仅是一个娱乐平台,它更是无数商家眼中的蓝海市场,是电商领域的新宠儿。在这场流量与转化的盛宴中,成都睿明智科技有限公司以其敏锐的市场洞察力和专业的服务能力,正逐步成为抖音电商…

【Linux】组管理权限管理任务调度【更详细,带实操】

Linux全套讲解系列,参考视频-B站韩顺平,本文的讲解更为详细 一、组管理 1、linux组的介绍 linux对文件的管理机制 linux中的文件有三个概念: 1、文件所有者是谁,谁创建了文件,当然文件所有者也可以修改2、文件属于…

企业供应链中台系统设计开发 一站式电商供应链解决方案

国内商业环境的变化极为剧烈,企业的成本优势快速丧失和消费者需求迅速多元化。企业“转型大战”已经全面展开。曾有人表示,企业转型也是一场“优胜劣汰”的游戏,如何降低企业转型风险? 企业供应链中台就是答案!在一定…

echarts图表刷新

图表制作完成&#xff0c;点击刷新图标&#xff0c;可以刷新。 <div class"full"><div id"funnel" class"normal"></div><div class"refreshs"><div class"titles_pic"><img src"./…

针对考研的C语言学习(定制化快速掌握重点1)

1.printf函数的几个要点 printf函数中所有的输出都是右对齐的&#xff0c;除非在%后面添加负号&#xff0c;则表示左对齐 #include<stdio.h> int main() {int num 10;int nums 100;float f 1000.2333333333;printf("%3d\n", nums);//%3d表示输出的总宽度至…