if (existing != null) {
// 若 existing 不为 null,则忽略该调用。对应方法注释的第 12 点。
return;
}
// 将 owner 和 observer 的包装对象添加到 owner.getLifecycle()。对应方法注释的第 1 点。
owner.getLifecycle().addObserver(wrapper);
}
第一个问题中 LiveData 怎么感知生命周期感知?
我们可以回答了,调用 observe 方法时,会调用 owner.getLifecycle().addObserver 已达到感知生命周期的目的。 observe 方法的内容很少,接着看下 owner 和 observer 的包装对象 LifecycleBoundObserver
LiveData 的内部类
class LifecycleBoundObserver extends ObserverWrapper implements LifecycleEventObserver {
@NonNull
final LifecycleOwner mOwner;
// 构造函数 owner 赋值给属性 mOwner, observer 则调用了 super
LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer<? super T> observer) {
super(observer);
mOwner = owner;
}
@Override
boolean shouldBeActive() {
return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
}
/**
- 当 source (也就是 mOwner) 的生命周期改变时会回调此方法
*/
@Override
public void onStateChanged(@NonNull LifecycleOwner source,
@NonNull Lifecycle.Event event) {
// 获取当前 mOwner 的生命周期状态
Lifecycle.State currentState = mOwner.getLifecycle().getCurrentState();
if (currentState == DESTROYED) {
// 如果是已销毁状态,则调用 LiveData#removeObserver 方法进行移除 mObserver (mObserver 是 LifecycleBoundObserver 的父类 ObserverWrapper 的属性,通过 ObserverWrapper 的构造函数来赋值),对应 LiveData#observe 方法注释的第 12 点。
removeObserver(mObserver);
return;
}
Lifecycle.State prevState = null;
while (prevState != currentState) {
prevState = currentState;
activeStateChanged(shouldBeActive());
currentState = mOwner.getLifecycle().getCurrentState();
}
}
@Override
boolean isAttachedTo(LifecycleOwner owner) {
return mOwner == owner;
}
@Override
void detachObserver() {
// 从 mOwner 中移除此观察者
mOwner.getLifecycle().removeObserver(this);
}
}
onStateChanged 方法中注释如果是已销毁状态,则调用 LiveData#removeObserver 方法进行移除 mObserver (mObserver 是 LifecycleBoundObserver 的父类 ObserverWrapper 的属性,通过 ObserverWrapper 的构造函数来赋值),对应 LiveData#observe 方法注释的第 12 点。 同时第一个问题已经得到了解决: **LiveData 怎么感知生命周期感知?需要取消注册吗?**LiveData#observe 看完啦,该看 setValue 和 postValue 了。
/**
-
Sets the value. If there are active observers, the value will be dispatched to them.
-
设置值。如果存在活动的观察者,则会将值分派给他们。
-
-
This method must be called fro