- 通过 setValue()/postValue() 更新数据的处理流程是如何?
- 生命周期变化后数据处理流程是怎么样的?
同时提前看下我整理的 LiveData UML 图,对 LiveData 有个整体的了解,后续的涉及到的类都在这里了,有助于理解。
(图1.LiveData 类图)
OK, here we go!
2.1 LiveData.observe()
LiveData 的使用流程从 observe()
开始,咱们尝试从 observe()
方法 开始分析:
@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer observer) {
//如果是 DESTROYED 的状态则忽略
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// ignore
return;
}
//把 Observer 用 LifecycleBoundObserver 包装起来
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
//缓存起来
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
//如果已经 observe 过 并且两次的 owner 不同则报错
if (existing != null && !existing.isAttachedTo(owner)) {
throw new IllegalArgumentException(“Cannot add the same observer”
- " with different lifecycles");
}
if (existing != null) {
return;
}
//绑定 owner
owner.getLifecycle().addObserver(wrapper);
}
可以看到 observe 方法里把我们传递的 observer 用 LifecycleBoundObserver
包装了起来,并且存入了 mObservers
,并且跟 owner 进行了关联。
并且做了两个特殊处理:
- 忽视处于 DESTROYED 的 owner 的注册行为;
- 将一个 Observer 同时绑定两个 owner 的行为视为非法操作,也即一个 Observer 只能绑定一个 owner,而 owner 可以有多个 Observer;
这里出现了几个新的类 LifecycleBoundObserver 、ObserverWrapper 来看看。
2.2 LifecycleBoundObserver
class LifecycleBoundObserver extends ObserverWrapper implements GenericLifecycleObserver {
@NonNull final LifecycleOwner mOwner;
LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer observer) {
super(observer);
mOwner = owner;
}
@Override
boolean shouldBeActive() {
// 判断 owner 当前的状态是否是至少 STARTED
return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
}
@Override
public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
//生命周期改变,如果是 DESTROYED 就自动解除
if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
removeObserver(mObserver