LiveData 是什么?LiveData是JetPack组件之一,LiveData是一个可观察的数据持有类,可以感知生命周期。 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。(来自Android官方解释)
LiveData的介绍和使用不在累述,直接看官方文档,本篇文章旨在讲解LiveData存在的意义以及实现的原理。 LiveData 为什么会出现?之前看过重学安卓的小专栏的讲解:
LiveData 它被设计为仅限于负责 数据在订阅者生命周期内的被分发,除了 setValue / postValue 发送数据,以及 observe订阅数据. 没有多余的方法。(摘自:重学Android KunMinX-LiveData诞生的设计原因)
LiveData 只有如下简单的几个类:

LiveData 其实就是为了解决数据分发、统一数据分发一致性、数据在订阅者生命周期内分发感知生命周期。 Google的描述的LiveData的优势如下:

下面我们来一一验证,LiveData的优势。
postValue/setValue
在LiveData只存在两个方法postValue/setValue来进行数据的分发,那么这两个方法有什么区别呢?
postValue: 可以在任意的线程下执行。setValue: 只能在主线程下执行。
//<T> 决定livedata 持有的数据类型
liveData = MutableLiveData<String>()
//设置持有的数据
//postValue 可以在任意的线程下执行
liveData.postValue("1")
thread {
liveData.postValue("3")
}
//setValue 只能在主线程执行
liveData.value = "2"
LiveData中源码的实现如下:实现的方式非常简单,最终都会调用到setValue最终存储在mData
protected void postValue(T value) {
boolean postTask;
synchronized (mDataLock) {
postTask = mPendingData == NOT_SET;//NOT_SET 是一个空对象
mPendingData = value;//存储发送的数据
}
if (!postTask) {//如果mPendingData 不等于 NOT_SET 说明mPostValueRunnable还没有执行完毕
return;
}
//主线程执行mPostValueRunnable
ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
}
//主线程执行Runnable
private final Runnable mPostValueRunnable = new Runnable() {
@SuppressWarnings("unchecked")
@Override
public void run() {
Object newValue;
synchronized (mDataLock) {
newValue = mPendingData;
mPendingData = NOT_SET;//将mPendingData置为空对象 对应了上述的postTask
}
setValue((T) newValue);//最终还是调用了setValue()方法
}
};
@MainThread //注解 标注了在主线程执行
protected void setValue(T value) {
assertMainThread("setValue"); // 判断是否在主线程
mVersion++;//版本号 后续会用到
mData = value;//mData 真实的数据
dispatchingValue(null);//将数据分发给观察者
}
发布/订阅数据
从上述的postValue/setValue 的方法,我们可以看到最终都会调用到
setValue并且调用了dispatchingValue进行发布数据。
LiveData中订阅数据,通过observe方法实现订阅数据:
//注册订阅者
//LifecycleOwner AppCompatActivity进行了实现
liveData.observe(this, {
Log.e("liveData-1", "onCreate:

本文探讨了Jetpack LiveData的核心特性,包括postValue和setValue的区别、数据发布与订阅、生命周期管理以及粘性事件的概念。LiveData通过感知生命周期避免了内存泄漏,并在订阅者进入活跃状态时发送最新数据,实现粘性事件效果。
最低0.47元/天 解锁文章
472

被折叠的 条评论
为什么被折叠?



