安卓LiveData与MutableLiveData的使用

ops/2024/9/24 20:14:21/

简介
  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);

http://www.ppmy.cn/ops/115439.html

相关文章

如何快速上手一个Github的开源项目

程序研发领域正是有一些热衷开源的小伙伴&#xff0c;技能迭代才能如此的迅速&#xff0c;因此&#xff0c;快速上手一个GitHub上的开源项目&#xff0c;基本上已经变成很个程序员小伙伴必须掌握的技能&#xff0c;因为终究你会应用到其中的一个或多个项目&#xff0c;帮助自己…

Docker UI强大之处?

DockerUI是一款由国内开发者打造的优秀Docker可视化管理工具。它拥有简洁直观的用户界面&#xff0c;使得Docker主机管理、集群管理和任务编排变得轻松简单。DockerUI不仅能展示资源利用率、系统信息和更新日志&#xff0c;还提供了镜像管理功能&#xff0c;帮助用户高效清理中…

《飞机大战游戏》实训项目(Java GUI实现)(设计模式)(简易)

目录 一、最终实现后&#xff0c;效果如下。 &#xff08;1&#xff09;简单介绍本游戏项目&#xff08;待完善&#xff09; &#xff08;2&#xff09;运行效果图&#xff08;具体大家自己可以试&#xff09; 初始运行情况。 手动更换背景图。 通过子弹攻击敌机&#xff0c;累…

yolo自动化项目实例解析(三)重构 1.85

原作者在1.85版本的时候将代码重构了&#xff0c;有很多步骤发生了变更&#xff0c;重新瞅瞅 素材包下载 https://download.csdn.net/download/qq_42883074/89787126 这个是3-5章所需的所有相关素材包&#xff0c;1.85版本的&#xff0c;解压到项目目录下即可按下面的步骤走 一…

关于Redis

1.列举一些项目中redis的使用场景&#xff0c;这些场景用到了什么类型 缓存 将经常访问的数据存储到redis中&#xff1b;String或Hash&#xff0c;用于存储键值对。 会话存储 用户的登录状态、购物车&#xff1b;存储会话数据。 消息队列 实现异步处理&#xff0c;比如发送邮…

DataGrip远程连接Hive

学会用datagrip远程操作hive 连接前提条件&#xff1a; 注意&#xff1a;mysql是否是开启状态 启动hadoop集群 start-all.sh 1、启动hiveserver2服务 nohup hiveserver2 >> /usr/local/soft/hive-3.1.3/hiveserver2.log 2>&1 & 2、beeline连接 beelin…

layui upload.render 设置文件名

在使用 layui 的 upload.render 方法进行文件上传时&#xff0c;通常文件名是由用户选择文件时决定的&#xff0c;即文件本身的名字。但是&#xff0c;在某些情况下&#xff0c;你可能需要在上传前修改文件名&#xff0c;或者上传后在服务器端进行处理时更改文件名。这里主要讨…

时间序列LSTM实现

这个代码参考了时间序列预测模型实战案例(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)_lstm预测模型-CSDN博客 结合我之前所学的lstm-seq2seq里所学习到的知识对其进行预测 import time import numpy as np import pandas as pd import torch import…