当前位置: 首页 > news >正文

安卓LiveData与MutableLiveData的使用

简介
  LiveData 是 Android 架构组件的一部分,用于持有和管理可观察的数据生命周期感知的数据容器。它的设计目的是在应用的 UI 和数据之间提供响应式的双向绑定,并在数据变化时通知观察者。LiveData还能知晓它绑定的Activity或者Fragment的生命周期,它只会给前台活动的activity回调,这样你可以放心的在它的回调方法里直接将数据添加到View,而不用担心会不会报错。

区别
  LiveData与MutableLiveData的其实在概念上是一模一样的,MutableLiveData是LiveData的子类,MutableLiveData是是整个实体类或者数据类型变化后才通知,而LiveData可以具体到某一个字段,而且可以选择哪些变更需要通知变更,哪些不需要。

LiveData的使用
1.BleCurrentInfo 类

public class BleCurrentInfo extends LiveData<BleCurrentInfo> {private boolean isConnect = false; // 当前连接状态private String bleName = "";private String bleAddress = "";public void setConnect(boolean isConnect) {this.isConnect = isConnect;postValue(this);}public boolean isConnect() {return isConnect;}public void setBleName(String bleName) {this.bleName = bleName;}public String getBleName() {return bleName;}public void setBleAddress(String bleAddress) {this.bleAddress = bleAddress;}public String getBleAddress() {return bleAddress;}
}

  在此demo中,当连接状态isConnect 变更时,会通知数据变更,而名称bleName 和地址bleAddress 变更时,则不会。其中的关键就是postValue(this)这一行代码,这表示通知通知数据变更。
  通知数据变更还有一种方法是setValue,两者的区别是:
  ① setValue方法必须在主线程中调用,用于同步更新数据。如果在非主线程中调用setValue,会抛出IllegalStateException异常。这是因为setValue的设计初衷是为了确保数据更新的线程安全性,确保只在主线程中更新UI相关的数据‌;postValue方法可以在任何线程中调用,包括主线程和非主线程。它内部会将数据更新操作放入主线程的消息队列中,等待主线程空闲时执行。这意味着,即使你在非主线程中调用postValue,数据更新也会在主线程中被处理,从而确保了UI更新的正确性。
  ② 当连续多次调用postValue时,只有最后一次调用会生效,即LiveData只会保存最后一次更新的数据,并且只会通知一次观察者。这是因为postValue在内部使用了一个待处理的数据变量mPendingData,当有新的数据需要更新时,如果mPendingData已经有值(即之前已经post过数据),mPendingData值会变更,但更新操作还未开始执行。setValue则不同,每一次调用都会立即更新数据并通知所有观察者。这是因为每次调用setValue都会直接更新数据并触发通知,而不考虑之前的数据状态‌。

2.在Activity中绑定

    private BleCurrentInfo mBleCurrentInfo = new BleCurrentInfo();private void onChangeData() {mBleCurrentInfo.observe(this, new Observer<BleCurrentInfo>() {@Overridepublic void onChanged(BleCurrentInfo bleCurrentInfo) {Log.i(TAG, "连接状态变更,当前状态:" + bleCurrentInfo.isConnect());}});}

  当mBleCurrentInfo 值变更时,Activity就会收到通知。
3.在Fragment中绑定

    private BleCurrentInfo mBleCurrentInfo = new BleCurrentInfo();private void onChangeData() {mBleCurrentInfo.observe(getViewLifecycleOwner(), new Observer<BleCurrentInfo>() {@Overridepublic void onChanged(BleCurrentInfo bleCurrentInfo) {Log.i(TAG, "连接状态变更,当前状态:" + bleCurrentInfo.isConnect());}});}

4.更新操作

    mBleCurrentInfo.setConnect(true);

MutableLiveData的使用
1.BleCurrentInfo 类

public class BleCurrentInfo {private boolean isConnect = false; // 当前连接状态private String bleName = "";private String bleAddress = "";public void setConnect(boolean isConnect) {this.isConnect = isConnect;}public boolean isConnect() {return isConnect;}public void setBleName(String bleName) {this.bleName = bleName;}public String getBleName() {return bleName;}public void setBleAddress(String bleAddress) {this.bleAddress = bleAddress;}public String getBleAddress() {return bleAddress;}
}

2.在Activity中使用

    private MutableLiveData<BleCurrentInfo> mBleCurrentInfo;private void onChangeData() {mBleCurrentInfo.observe(this, new Observer<BleCurrentInfo>() {@Overridepublic void onChanged(BleCurrentInfo bleCurrentInfo) {Log.i(TAG, "连接状态变更,当前状态:" + bleCurrentInfo.isConnect());}});}

3.在Fragment中使用

    private MutableLiveData<BleCurrentInfo> mBleCurrentInfo;private void onChangeData() {mBleCurrentInfo.observe(getViewLifecycleOwner(), new Observer<BleCurrentInfo>() {@Overridepublic void onChanged(BleCurrentInfo bleCurrentInfo) {Log.i(TAG, "连接状态变更,当前状态:" + bleCurrentInfo.isConnect());}});}

4.更新操作

        BleCurrentInfo bleCurrentInfo = new BleCurrentInfo();bleCurrentInfo.setConnect(true);mBleCurrentInfo.setValue(bleCurrentInfo);

相关文章:

  • Excel DAYS函数怎么用,DAYS函数的使用方法来了
  • (含答案)C++笔试题你可以答对多少?
  • 探索 Python 中的 AI 魔法:markdownify 库的奥秘
  • 从安防视频监控行业发展趋势看EasyCVR平台如何驱动行业智能升级
  • makefile和CMakeLists/C++包管理器
  • vue3中echarts柱状图横轴文字太多放不下怎么解决
  • OpenCV_距离变换的图像分割和Watershed算法详解
  • 【Redis】Centos 安装 Redis
  • 橙子质量检测系统源码分享
  • 人工智能之机器学习常见算法
  • 机器学习(1)sklearn的介绍和六个主要模块、估计器、模型持久化
  • 代码随想录Day53|102.沉没孤岛 、103.水流问题 、104.建造最大岛屿
  • 程序编译的四个阶段
  • Ubuntu20.04配置NVIDIA+CUDA12.2+CUDNN【附所有下载资源】【亲测有效】【非常详细】
  • docker的核心概念整理:docker-compose
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 【译】理解JavaScript:new 关键字
  • 4. 路由到控制器 - Laravel从零开始教程
  •  D - 粉碎叛乱F - 其他起义
  • Java读取Properties文件的六种方法
  • java取消线程实例
  • Laravel 实践之路: 数据库迁移与数据填充
  • MySQL的数据类型
  • Promise面试题,控制异步流程
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 怎么把视频里的音乐提取出来
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 从如何停掉 Promise 链说起
  • ​数据结构之初始二叉树(3)
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #{}和${}的区别?
  • ${ }的特别功能
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (day6) 319. 灯泡开关
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (poj1.3.2)1791(构造法模拟)
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (回溯) LeetCode 78. 子集
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (转)ORM
  • (转)重识new
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (转载)hibernate缓存
  • (自用)交互协议设计——protobuf序列化
  • .NET C# 操作Neo4j图数据库
  • .NET 通过系统影子账户实现权限维持
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • @Async 异步注解使用
  • @RestController注解的使用
  • []error LNK2001: unresolved external symbol _m
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [C#]winform使用onnxruntime部署LYT-Net轻量级低光图像增强算法