1、observer方法
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {assertMainThread("observe");if (owner.getLifecycle().getCurrentState() == DESTROYED) {// ignorereturn;}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);}
- 首先判斷
LifecycleOwner
是否為DESTROYED
狀態,如果是就直接忽略,不能添加。 - 其次用
LifecycleOwner
、observer
?組裝成LifecycleBoundObserver
包裝實例wrapper
- 使用
putIfAbsent()
方法observer-wrapper
作為key-value
添加到觀察者列表mObservers
中。不能添加具有不同生命周期的相同觀察者,否則會拋異常,但是同owner
可以add
多個Observer
; - 最后用
LifecycleOwner
的Lifecycle
添加observer
的封裝wrapper
2、數據存儲位置?
private SafeIterableMap<Observer<? super T>, ObserverWrapper> mObservers =
new SafeIterableMap<>();
3、在Lifecycle生命周期結束時移除對應觀察者
4、值的更新
protected void setValue(T value) {assertMainThread("setValue"); //檢查是否在主線程mVersion++; //默認值是-1,每次更新數據都會自增mData = value; //更新的數據賦值給mDatadispatchingValue(null); //調用 dispatchingValue()方法并傳入null,將數據分發給所有觀察者。dispatchingValue如果傳入null則是所有的觀察者,如果是具體的ObserverWrapper對象,則通知到具體的Observer。
}
protected void postValue(T value) {boolean postTask; //用于判斷是否要更新//加鎖解決多個子線程同時調用問題synchronized (mDataLock) {postTask = mPendingData == NOT_SET;mPendingData = value; //將數據存入 mPendingData}if (!postTask) {return;}//通過線程池分發到主線程去處理ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
}
private final Runnable mPostValueRunnable = new Runnable() {@SuppressWarnings("unchecked")@Overridepublic void run() {Object newValue;synchronized (mDataLock) {newValue = mPendingData;mPendingData = NOT_SET;}setValue((T) newValue);}
};
真正的發送方法是considerNotify()
private void considerNotify(ObserverWrapper observer) {//觀察者非活躍,直接returnif (!observer.mActive) {return;}//觀察者狀態活躍,但是當前變為了不可見狀態,再調用activeStateChanged方法,并傳入false,其內部會再次判斷if (!observer.shouldBeActive()) {observer.activeStateChanged(false);return;}//如果數據版本已經是最新的了,那么直接返回if (observer.mLastVersion >= mVersion) {return;}//修改數據版本observer.mLastVersion = mVersion;observer.mObserver.onChanged((T) mData);//回調真正的mObserver的onChanged方法
}