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

安卓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>() {
            @Override
            public 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>() {
            @Override
            public 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>() {
            @Override
            public void onChanged(BleCurrentInfo bleCurrentInfo) {
                Log.i(TAG, "连接状态变更,当前状态:" + bleCurrentInfo.isConnect());
            }
        });

    }

3.在Fragment中使用

    private MutableLiveData<BleCurrentInfo> mBleCurrentInfo;

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

    }

4.更新操作

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

http://www.kler.cn/a/316956.html

相关文章:

  • Java 责任链模式 减少 if else 实战案例
  • ARM架构中断与异常向量表机制解析
  • Vue2:组件
  • 深度学习——优化算法、激活函数、归一化、正则化
  • 山泽光纤HDMI线:铜线的隐藏力量
  • [运维][Nginx]Nginx学习(1/5)--Nginx基础
  • 游戏淡入淡出效果
  • 消息中间件---Kafka
  • 频率增强通道注意力机制(FECAM)学习总结
  • LLMs之Qwen:Qwen2.5的简介、安装和使用方法、案例应用之详细攻略
  • Redisson 总结
  • 二叉树---java---黑马
  • 吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)2.1-2.2
  • 【IPV6从入门到起飞】5-5 IPV6+Home Assistant(HACS商店安装)docker版本安装
  • Leetcode3289. 数字小镇中的捣蛋鬼
  • vue中高德地图使用 Marker 标点 - 标点数据快到 1000 时页面卡顿问题解决(已解决 - 多方面原因)+ 海量点功能实现解决
  • 南昌大学-计算机科学与技术专业-预推免-专业课(408)复试面试准备
  • 通信工程学习:什么是MANO管理编排
  • 蓝桥杯嵌入式的学习总结
  • 18 基于51单片机的心率体温监测报警系统(包括程序、仿真、原理图、流程图)
  • helm安装promethues
  • MySQL的缓存策略
  • 数据结构二
  • 影刀RPA实战:网页爬虫之携程酒店数据
  • 文件(打开关闭读写) C语言
  • 面向对象程序设计——mapの简析