Android资深工程书之LiveData核心组件原理剖析
LiveData是Android架构组件库中的一个类,用于在应用程序组件之间共享数据。它是一种可观察的数据持有者,可以感知应用程序组件的生命周期,并在数据发生变化时通知观察者。
使用LiveData
在Android应用程序中使用LiveData,你可以按照以下步骤进行:
- 创建LiveData实例: 在ViewModel类中创建LiveData对象,并定义数据类型。例如,可以在ViewModel中声明一个LiveData对象:
private MutableLiveData myLiveData = new MutableLiveData<>();
- 观察LiveData数据变化: 在Activity或Fragment中获取ViewModel实例,并使用observe()方法观察LiveData数据的变化。例如,可以在Activity中的onCreate()方法中添加以下代码:
myViewModel.getMyLiveData().observe(this, new Observer()
{
@Override
public void onChanged(@Nullable String data)
{
// 在这里更新UI或执行其他操作
}
});
- 更新LiveData数据: 在ViewModel中,可以通过setValue()或postValue()方法更新LiveData的值。setValue()方法应该在主线程中调用,而postValue()方法可以在任何线程中调用。例如,可以在ViewModel中添加以下方法来更新LiveData的值:
public void updateLiveData(String newData) { myLiveData.setValue(newData);
}
LiveData与ViewModel
LiveData与ViewModel是Android架构组件库中两个关键的组件,它们可以一起使用来实现响应式UI。
LiveData是一个可观察的数据持有者,用于在应用程序组件之间共享数据。它具有生命周期感知能力,可以感知应用程序组件的生命周期,并在数据发生变化时通知观察者。LiveData确保数据更新操作在主线程执行,同时提供了方法来在后台线程进行数据计算和操作。
ViewModel是用于存储和管理与UI相关的数据的类。它在配置变化(如屏幕旋转)时保持数据的一致性,并与UI层解耦,提供了一种持久性的数据存储方式。ViewModel通常与LiveData一起使用,将数据存储在LiveData对象中,并在数据变化时通知观察者更新UI。
在ViewModel中创建LiveData实例的步骤如下:
- 在ViewModel类中声明一个LiveData对象,并定义数据类型。例如,可以在ViewModel中添加以下代码:
private MutableLiveData myLiveData = new MutableLiveData<>();
- 提供一个公共的方法来获取LiveData对象。例如,可以在ViewModel中添加以下方法:
public LiveData getMyLiveData() { return myLiveData;
}
在Activity或Fragment中观察LiveData数据的变化的步骤如下:
- 获取ViewModel实例。可以使用ViewModelProviders类的静态方法获取ViewModel实例。例如,在Activity中可以添加以下代码:
MyViewModel myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
- 使用observe()方法观察LiveData数据的变化。在Activity或Fragment中,可以在onCreate()方法或其他适当的位置添加以下代码:
myViewModel.getMyLiveData().observe(this, new Observer() {
@Override
public void onChanged(@Nullable String data) {
// 在这里更新UI或执行其他操作 } });
LiveData的数据转换和操作
LiveData提供了一些方法来进行数据转换和操作,以及线程处理,以确保数据的正确性和性能。
数据转换和操作:
Transformations.map():该方法接收一个LiveData对象和一个转换函数,返回一个新的LiveData对象,其中的数据经过转换函数的处理。例如,可以将一个LiveData<String>对象转换为LiveData<Integer>对象:LiveData transformedLiveData = Transformations.map(stringLiveData, new Function() { @Override
public Integer apply(String data) {
// 在这里进行数据转换操作
return Integer.parseInt(data);
} });
Transformations.switchMap():该方法与map()类似,但是在转换函数中可以返回另一个LiveData对象。这样,当原始LiveData对象的值发生变化时,转换函数可以动态地切换到返回的LiveData对象。例如,可以根据用户输入的关键字来搜索并返回LiveData对象:
LiveData keywordLiveData = ...;
LiveData> searchResultsLiveData = Transformations.switchMap(keywordLiveData, new Function>>() { @Override
public LiveData> apply(String keyword) {
// 在这里进行搜索操作,返回一个LiveData对象
return searchRepository.search(keyword);
} });
LiveData的线程处理
线程处理: LiveData默认在主线程上分发数据更新。这意味着当LiveData的值发生变化时,观察者的回调方法将在主线程上调用。这对于更新UI是很方便的,因为只能在主线程上更新UI。 如果需要在后台线程执行数据计算或操作,可以使用LiveData的postValue()方法。它可以在任何线程上调用,将数据更新的操作提交到主线程上执行,以确保数据更新的安全性。例如,可以在后台线程中执行网络请求并更新LiveData的值:
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.execute(new Runnable() {
@Override
public void run() {
// 在这里执行网络请求,并更新LiveData的值 myLiveData.postValue(newValue);
}
});
如果需要在后台线程中执行数据转换或操作,并且希望结果在主线程上分发,可以结合使用Transformations类和LiveData的postValue()方法。例如,可以在后台线程中进行数据转换操作,并在主线程上分发结果:
LiveData transformedLiveData = Transformations.map(inputLiveData, new Function() {
@Override
public Result apply(Input input) {
// 在这里进行数据转换操作
return doTransformation(input);
} });
transformedLiveData.observe(this, new Observer() {
@Override
public void onChanged(Result result) {
// 在这里更新UI或执行其他操作
} });
更多有关Android开发的进阶核心技术,可以查看我的主页更多信息。
最后
- LiveData是一个可观察的数据持有者,用于在应用程序组件之间共享数据。
- LiveData具有生命周期感知能力,可以感知应用程序组件的生命周期,并在数据发生变化时通知观察者。
- LiveData提供了数据转换和操作的方法,如map()和switchMap(),用于对数据进行转换、过滤、组合等操作。
- LiveData默认在主线程上分发数据更新,以确保数据更新的安全性,同时也提供了postValue()方法,可以在任何线程上更新LiveData的值。
- LiveData与ViewModel一起使用,可以帮助实现响应式UI和持久性数据存储,提高应用程序的可维护性和性能。
相关文章:
Android资深工程书之LiveData核心组件原理剖析
LiveData是Android架构组件库中的一个类,用于在应用程序组件之间共享数据。它是一种可观察的数据持有者,可以感知应用程序组件的生命周期,并在数据发生变化时通知观察者。 使用LiveData 在Android应用程序中使用LiveData,你可以…...
Vue的五种方法实现加减乘除运算
五种方法的详细说明: 计算属性(Computed Properties): 计算属性是Vue.js提供的一种便捷的属性,它根据依赖的数据动态计算出一个新的值。计算属性的值会被缓存,只有当依赖的数据发生变化时,才会…...
C++(1)Linux基础知识
经济下行,计算机就业形势严峻,为了勉励自己继续进步,继续学习代码提高核心竞争力。 安装QT Creator 首先,安装QT开发工具QT Creator 参考:2021最新Qt6开发环境(Qt Creator)安装以及卸载记录_q…...
接口自动化yaml文件读取与写入
前言 在走进yaml文件之前大家应该都很想知道他是用来干嘛的? 是的是的,他是用来做接口自动化测试的。 我们一起来学习他吧!——(一定要收藏带走哦❤) 1、yaml文件有什么作用呢? ①可作为配置文件使用—…...
Java Map、JSONObject、实体类互转
文章目录 前言Map、JSONObject、实体类互转 前言 使用库 com.alibaba.fastjson2,可完成大部分JSON转换操作。 详情参考文章: Java FASTJSON2 一个性能极致并且简单易用的JSON库 Map、JSONObject、实体类互转 import com.alibaba.fastjson2.JSON; import com.alib…...
在Hive/Spark上执行TPC-DS基准测试 (PARQUET格式)
在上一篇文章:《在Hive/Spark上运行执行TPC-DS基准测试 (ORC和TEXT格式)》中,我们介绍了如何使用 hive-testbench 在Hive/Spark上执行TPC-DS基准测试,同时也指出了该项目不支持parquet格式。 如果我们想要生成parquet格式的测试数据,就需要使用其他工具了。本文选择使用另…...
基于CentOS搭建私有仓库harbor
环境: 操作系统:CentOS Linux 7 (Core) 内核: Linux 3.10.0-1160.el7.x86_64 目录 安装搭建harbor (1)安装docker编排工具docker compose (2)下载Harbor 安装包 (3&…...
PDF怎么转Word?8 个最佳 PDF 转 Word 转换器
PDF 转 Word 转换工具只是一个特殊程序,可以将 PDF(本机和/或扫描)转换为 Microsoft Office Word 格式。将 PDF 导出到 Word 的主要原因之一是满足可编辑文档的需求,尽管还有其他原因。 由于缺少 PDF 阅读器,您可以选…...
老板都爱看的财务数据分析报表,全在这了
老板们都爱看哪些财务数据分析报表?自然是可以帮助他们更好地了解公司的财务状况和经营绩效的那一类财务数据分析报表,比如利润表、资产负债表、现金流量表、应收账款分析报表、应付账款分析报表、库存分析报表等。奥威BI数据可视化工具有一套标准化财务…...
ZooKeeper(zk)与 Eureka 的区别及集群模式比较分析
作者:zhaokk 推荐阅读 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 资源分享 「java、python面试题」来自UC网盘app分享,打开手机appÿ…...
搜狗拼音占用了VSCode及微信小程序开发者工具快捷键Ctrl + Shit + K 搜狗拼音截图快捷键
修改搜狗拼音的快捷键 右键--更多设置--属性设置--按键--系统功能快捷键--系统功能快捷键设置--取消Ctrl Shit K的勾选--勾选截屏并设置为Ctrl Shit A 微信开发者工具设置快捷键 右键--Command Palette--删除行 微信开发者工具快捷键 删除行:Ctrl Shit K 或…...
PMI-ACP值得考吗?在中国的前景如何?
相信很多小伙伴都听过PMP证书吧,但是对于PMI-ACP则知之甚少。那么同为项目管理证书,PMI-ACP认证的含金量怎么样呢?今天咱们就来聊一聊PMI-ACP敏捷项目管理证书。 PMI-ACP是由PMI(美国项目管理协会)颁发的针对敏捷项目…...
centos 安装防火墙,并开启对应端口号
1.查看防火墙状态: 命令:systemctl status firewalld.service 开启防火墙时,提示没有安装防火墙 [rootlocalhost ~]# systemctl start firewalld.service Failed to start firewalld.service: Unit not found.2.安装防火墙 [rootlocalhost …...
学习微信小程序时间延迟setTimeout和setInterval的使用方法
学习微信小程序时间延迟setTimeout和setInterval的使用方法 setTimeout()setInterval() setTimeout() setTimeout在使用的时候可以实现代码块延迟执行的效果,并且可以设置延迟执行的具体时间。请见如下代码: setTimeout(function() {//要实现延迟执行效…...
Vite好用的前端构建工具
是什么 Vite是Vue的作者尤雨溪开发的 一种新型前端构建工具。 Vite在大型项目开发模式下,打包速度远高于webpack。 Vite 为什么这么快 1. 快速冷启动 Vite只启动一台静态页面的服务器,不会打包全部项目文件代码,服务器根据客户端的请求加…...
Agile Iteration Velocity
【agile iteration velocity】敏捷速度指的平均速度 第四次迭代结束速度: 76 / 4 19 第五次迭代结束速度: (76 24 ) / 5 100 / 5 20...
HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制LazyForEach数据懒加载
LazyForEach从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。当LazyForEach在滚动容器中使用了,框架会根据滚动容器可视区域按需创建组件,当组件划出可视区域外时,框架会进行组件销毁回收以降低内存占用。一、接…...
04_15页表缓存(TLB)和巨型页
前言 linux里面每个物理内存(RAM)页的一般大小都是4kb(32位就是4kb),为了使管理虚拟地址数变少 加快从虚拟地址到物理地址的映射 建议配值并使用HugePage巨型页特性 cpu和mmu和页表缓存(TLB)和cache和ram的关系 CPU看到的都是虚拟地址,需要经过MMU的转化…...
ResourceBundle类:读取配置文件
ResourceBundle类是java自带的类,类路径:java.util.ResourceBundle,用来读取项目中后缀为properties的配置文件。 下面简单举例说明一下用法: 数据准备 1)配置文件名称:application.propertiesÿ…...
数学建模的三大模型和十大常用算法
一、三大模型 预测模型 神经网络预测、灰色预测、拟合插值预测(线性回归)、时间序列预测、马尔科夫链预测、微分方程预测、Logistic模型等等。 应用领域:人口预测、水资源污染增长预测、病毒蔓延预测、竞赛获胜概率预测、月收入预测、销量预测、经济发展情况预测等在…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
