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(&#