Android LiveData关键代码
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方法
}