有上文对LiveData的基本认识,接下来直接进入LiveData的源码分析,首先进入observer方法,需要注意的是MainActivity继承AppCompatActivity,是LifecycleOwner接口实现类的子孙。而调用observer方法时传入当前MainActivity的上下文,可以理解为owner就是当前的MainActivity。
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
//判断当前LifecycleOwner即Activity的生命周期状态,如果为DESTROYED就没必要执行了
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// ignore
return;
}
//注释2
//对传入的observer封装为LifecycleBoundObserver,类比Handler机制中将Runnable封装为Message
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
//每次注册一个观察者,就会存放到map集合中
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;
}
//注释3
//owner就是LifecycleOwner,而我们MainActivity的父类AppCompatActivity 是LifecycleOwner
//的实现类ComponentActivity的子类,即给我们的MainActivity注册了一个与声明周期相关的观察者
//LifecycleObserver,这样一来就能感知组件的生命周期了。也就是说我们的MainActivity声明周期
//发生变化的时候,会回调wrapper接口,即回调observer接口,也就是触发观察者中的逻辑
owner.getLifecycle().addObserver(wrapper);
}
在注释2处,对观察者observer做了一层封装,集合中保存的是wrapper。注释3处,通过addObserver注册了生命周期的观察监听,到这里我们就大概知道,postValue会触发observer方法,组件即MainActivity生命周期发生变化的时候,也会触发observer方法,具体流程接着往下看。
接下来就从postValue方法发送数据,触发观察者接口回调的流程进行简单分析。进入postValue方法:
protected vo