LiveData的工作原理分析

2020-06-24  本文已影响0人  dashingqi
Android_Banner.jpg

简介

源码解析

obseve()
 @MainThread
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
        //必须运行在主线程中
        assertMainThread("observe");
        //如果当前组件的状态是DESTROYED就不做任何操作(其实就是不添加这个观察者)
        if (owner.getLifecycle().getCurrentState() == DESTROYED) {
            // ignore
            return;
        }
        // 将owner和observer传入到LifecycleBoundObserver构建了一个LifecycleBoundObserver对象
        // LifecycleBoundObserver extends ObserverWrapper implements LifecycleEventObserver
                // LifecycleEventObserver extends LifecycleObserver
        LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
        // 注释1
        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;
        }
        //注释2
        owner.getLifecycle().addObserver(wrapper);
    }
@Override
        public void onStateChanged(@NonNull LifecycleOwner source,
                @NonNull Lifecycle.Event event) {
                // 当组件的生命周期状态变成DESTROYED
            if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
                    // 就将当前添加的观察者移除,这也是为什么处于不可见状态的组件中的观察者收不到 LiveData数据源变换的回调
                removeObserver(mObserver);
                return;
            }
            activeStateChanged(shouldBeActive());
        }
setValue()
@MainThread
    protected void setValue(T value) {
        //检查是否运行在祝线程中
        assertMainThread("setValue");
        //版本自增1
        mVersion++;
        //将当前的value赋值给mData
        mData = value;  
        // 调用了dispatchingValue的方法 传入了null值
        dispatchingValue(null);
    }


 void dispatchingValue(@Nullable ObserverWrapper initiator) {
                // 当前正在处于分发数据中              
        if (mDispatchingValue) {
            mDispatchInvalidated = true;
            //继续之前的分发数据
            return;
        }
        mDispatchingValue = true;
        do {
            mDispatchInvalidated = false;
            //注释1
            if (initiator != null) {
                considerNotify(initiator);
                initiator = null;
            } else {
                //注释2
                for (Iterator<Map.Entry<Observer<? super T>, ObserverWrapper>> iterator =
                        mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
                    considerNotify(iterator.next().getValue());
                    if (mDispatchInvalidated) {
                        break;
                    }
                }
            }
        } while (mDispatchInvalidated);
        mDispatchingValue = false;
    }
private void considerNotify(ObserverWrapper observer) {
            // 如果当前的组件不是处于活跃状态,就停止运行
        if (!observer.mActive) {
            return;
        }
        // Check latest state b4 dispatch. Maybe it changed state but we didn't get the event yet.
        //
        // we still first check observer.active to keep it as the entrance for events. So even if
        // the observer moved to an active state, if we've not received that event, we better not
        // notify for a more predictable notification order.
        if (!observer.shouldBeActive()) {
            observer.activeStateChanged(false);
            return;
        }
        if (observer.mLastVersion >= mVersion) {
            return;
        }
        observer.mLastVersion = mVersion;
            // 注释1
        observer.mObserver.onChanged((T) mData);
    }
postValue()
 protected void postValue(T value) {
        boolean postTask;
        synchronized (mDataLock) {
            postTask = mPendingData == NOT_SET;
            mPendingData = value;
        }
        if (!postTask) {
            return;
        }
        //从工作线程切换到UI线程,同样通过创建一个Handler关联到祝线程的Looper,调用了post方法,提交一个Runnable,切换到祝线程去执行run方法中的逻辑
        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;
            }
            // postValue()最终还是调用了setValue()方法
            setValue((T) newValue);
        }
    };

总结

上一篇 下一篇

猜你喜欢

热点阅读