安卓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);
相关推荐
黄林晴2 小时前
如何判断手机是否是纯血鸿蒙系统
android
火柴就是我2 小时前
flutter 之真手势冲突处理
android·flutter
法的空间3 小时前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
循环不息优化不止3 小时前
深入解析安卓 Handle 机制
android
恋猫de小郭3 小时前
Android 将强制应用使用主题图标,你怎么看?
android·前端·flutter
jctech3 小时前
这才是2025年的插件化!ComboLite 2.0:为Compose开发者带来极致“爽”感
android·开源
用户2018792831673 小时前
为何Handler的postDelayed不适合精准定时任务?
android
叽哥3 小时前
Kotlin学习第 8 课:Kotlin 进阶特性:简化代码与提升效率
android·java·kotlin
Cui晨3 小时前
Android RecyclerView展示List<View> Adapter的数据源使用View
android
氦客3 小时前
Android Doze低电耗休眠模式 与 WorkManager
android·suspend·休眠模式·workmanager·doze·低功耗模式·state_doze