LiveData的基本介绍:
构造方法
liveData有无参和有参数两个构造方法
public LiveData(T value) {
mData = value;
mVersion = START_VERSION + 1;
}
public LiveData() {
mData = NOT_SET;
mVersion = START_VERSION;
}
可以看到liveData在构造函数给mData和mVersion这两个变量进行了赋值 查看一下使用和赋值的地方就可以知道mData是需要发送的数据源
observer.mObserver.onChanged((T) mData);
mVersion则是用来判断当前mData有没有被发送过
if (observer.mLastVersion >= mVersion) {
return;
}
observer.mLastVersion = mVersion;
observe
看完了构造方法我们来看一下observe方法,也是LiveData最核心的方法 observe方法需要传入两个参数,一个LifecycleOwner一个Observer LifecycleOwner用来绑定生命周期,Observer为数据和生命周期变化观察者
@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
//判断是否是主线程
assertMainThread("observe");
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// ignore
return;
}
//构建一个LifecycleBoundObserver 用于观察生命周期
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
//查询观察者是否已经添加过
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
if (existing != null && !existing.isAttachedTo(owner)) {
throw new IllegalArgumentException("Cannot add the same observer"
+ " with different lifecycles");
}
if (existing != null) {
return;
}
//添加观察者 观察生命周期变化
owner.getLifecycle().addObserver(wrapper);
}
简单的流程图如下
LiveData也提供了无需绑定生命周期的observeForever方法。
setValue
我们再来看一下LiveData的setValue方法
protected void setValue(T value) {
assertMainThread("setValue");
mVersion++;
mData = value;
dispatchingValue(null);
}
可以看到在对mData进行赋值后调用了dispatchingValue(null)
void dispatchingValue(@Nullable ObserverWrapper initiator) {
// 判断是否有数据正在发送中
if (mDispatchingValue) {
mDispatchInvalidated = true;
return;
}
mDispatchingValue = true;
do {
mDispatchInvalidated = false;
// 传入观察者不为空直接通知该观察者更新
if (initiator != null) {
considerNotify(initiator);
initiator = null;
} else {
// 轮询通知所有观察者
for (Iterator<Map.Entry<Observer<? super T>, ObserverWrapper>> iterator =
mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
considerNotify(iterator.next().getValue());
if (mDispatchInvalidated) {
break;
}
}
}
} while (mDispatchInvalidated);
// 数据更新完成
mDispatchingValue = false;
}