0. 前言
LiveData是Jetpack中一个响应式开发框架,官方文档对它的说明是一种可观察的数据存储器类,具有生命周期感知能力。有点类似于感知生命周期的RxJava。
0.1 用法
通常LiveData都是结合着ViewModel使用的,一般都是在ViewModel中创建LiveData:
class MvvmViewModel : ViewModel() {
// 通过MutableLiveData创建一个可读可写的LiveData
// 设置为Private,避免外部对数据直接进行修改,并暴露对外接口,让外部通过接口来修改
private val _count = MutableLiveData(0)
// 暴露给外部一个只读的LiveData副本,让外部监听数据通过此LiveData监听
val count: LiveData<Int>
get() = _count
fun increaseCount() {
_count.value = _count.value?.plus(1)
}
fun clearCount() {
_count.value = 0
}
}
0.2 源码
LiveData源码其实挺简单的,但是在看他的源码之前得先了解Lifecycle的源码,因为LiveData其实是大量通过Lifecycle实现的。
1. MutableLiveData
这个类是我们用来可读可写的LiveData,我们对值的修改都是通过这个类的,那我们来看下他的源码:
public class MutableLiveData<T> extends LiveData<T> {
public MutableLiveData(T value) {
super(value);
}
c MutableLiveData() {
super();
}
@Override
public void postValue(T value) {
super.postValue(value);
}
@Override
public void setValue(T value) {
super.setValue(value);
}
}
源码就这么点,全是调用父类的方法,而他的父类就是LiveData类。
那么既然这些方法都是调用的LiveData的,那么为什么我们不直接使用LiveData而要去使用MutableLiveData呢?
当你看到LiveData源码时就能知道,LiveData虽然有这些方法,但是他是一个抽象类,没办法直接构造对象,所以我们就需要通过MutableLiveData来操作。
2. LiveData
2.1 基本属性
public abstract class LiveData<T> {
// 数据锁,通过Synchronized线程同步
@SuppressWarnings("WeakerAccess") /* synthetic access */
final Object mDataLock = new Object();
// LiveData的初始化版本
// 如果构造方法中没有给值,那么 mVersion 直接使用此值
// 如果给值,那么 mVersion=START_VERSION+1
// 见下面构造方法
static final int START_VERSION = -1;
// mData的默认值
// 如果构造方法传值,那么mData使用传入的值
// 如果没有,则使用此值
// 见下面构造方法
@SuppressWarnings("WeakerAccess") /* synthetic access */
static final Object NOT_SET = new Object();
// 一个SafeIterableMap,用来保存监听的对象,key是观察者对象,value是观察者和mActive、mVersion构成的一个对象
// SafeIterableMap是一个可以安全递归的HashMap
private SafeIterableMap<Observer<? super T>, ObserverWrapper> mObservers =
new SafeIterableMap<>();
// 活跃的Obsever的数量
@SuppressWarnings("WeakerAccess") /* synthetic access */
int mActiveCount = 0;
// 当前LiveData的数据
private