數(shù)據(jù)容器,并且可以感知生命周期。
LiveData 提供了一個 observe() 方法
@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
assertMainThread("observe");
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
return;
}
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
//觀察者注冊
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
if (existing != null && !existing.isAttachedTo(owner)) {
}
if (existing != null) {
return;
}
//注冊到LifecycleRegistry,為了感知生命周期
owner.getLifecycle().addObserver(wrapper);
}
它主要做兩件事情
1汰扭,定義一個 LifecycleObserver 注冊到 Lifecycle ,觀察生命周期福铅,這里使用 LifecycleEventObserver 萝毛。
2,用一個包裝者類滑黔,封裝 LiveData 中定義的 Observer 笆包,將對應(yīng)關(guān)系存入內(nèi)部 Map。即子類 LifecycleBoundObserver略荡。
組件生命周期狀態(tài)改變時
首先通過 LifecycleEventObserver 感知庵佣,onStateChanged() 方法被調(diào)用,根據(jù)活動信息撞芍,交給 Wrapper 的 activeStateChanged() 統(tǒng)一處理秧了,通知 Observer。
@Override
public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
removeObserver(mObserver);
return;
}
activeStateChanged(shouldBeActive());
}
如果組件生命周期銷毀序无,將 Observer 從 Map 移除验毡,同時衡创,解除 LifecycleEventObserver 觀察者。
因此晶通,LiveData 可以感知生命周期璃氢。
ObserverWrapper 的 activeStateChanged() 方法。
void activeStateChanged(boolean newActive) {
if (newActive == mActive) {
return;
}
mActive = newActive;
boolean wasInactive = LiveData.this.mActiveCount == 0;
LiveData.this.mActiveCount += mActive ? 1 : -1;
if (wasInactive && mActive) {
onActive();
}
if (LiveData.this.mActiveCount == 0 && !mActive) {
onInactive();
}
if (mActive) {
dispatchingValue(this);
}
}
當(dāng)組件活動時狮辽,做一次派發(fā)一也。
LiveData 的 dispatchingValue() 方法,通過 considerNotify() 通知到觀察者喉脖。
private void considerNotify(ObserverWrapper observer) {
if (!observer.mActive) {
return;
}
if (!observer.shouldBeActive()) {
observer.activeStateChanged(false);
return;
}
if (observer.mLastVersion >= mVersion) {
return;
}
observer.mLastVersion = mVersion;
observer.mObserver.onChanged((T) mData);
}
數(shù)據(jù)更新椰苟。
mVersion,標(biāo)記 Data 版本树叽,每一次 setValue()舆蝴,做一次升級。
并不是每次生命周期活動都會走到 onChanged() 這一步题诵。
總結(jié):LiveData中的數(shù)據(jù)更新機(jī)制洁仗,setValue時,數(shù)據(jù)改變性锭,根據(jù)Map通知所有Wrapper赠潦,被觀察者感知,生命周期改變時草冈,Wrapper 同步狀態(tài)她奥,必要時更新數(shù)據(jù)。
任重而道遠(yuǎn)