1、observer方法
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
assertMainThread("observe");
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// ignore
return;
}
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; //更新的数据赋值给mData
dispatchingValue(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")
@Override
public void run() {
Object newValue;
synchronized (mDataLock) {
newValue = mPendingData;
mPendingData = NOT_SET;
}
setValue((T) newValue);
}
};
真正的发送方法是considerNotify()
private void considerNotify(ObserverWrapper observer) {
//观察者非活跃,直接return
if (!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方法
}