android viewModel 源码与原理 观察者探索

说明

viewmodel 是android 现在推出来的基于观察者模式的数据处理方式。
是在androidx下的lifecycle 包名下面,
android viewModel 源码与原理 观察者探索_第1张图片

一、LiveData 类 在androidx.lifecycle的lifecycle-live-core包下

LiveData 是基类,下面有MutableLiveData实现类。这个是一个中间类,用来处理Owner和observer之间的关系。

1.1、SafeIterableMap

这个是用来存储Observer和owner的,这里我们看ObserverWrapper,这是一个装饰类

    private SafeIterableMap<Observer<? super T>, ObserverWrapper> mObservers =
            new SafeIterableMap<>();

1.2、observe 方法

在这里,LifecycleBoundObserver,就是继承ObserverWrapper方法的,实现了对owner和observer的装饰增强处理。LifecycleBoundObserver 绑定状态。

  1. wrapper 实现了对状态的绑定
  2. existing 本地存储一份observer
  3. owner(Fragment,Activity)存储一份observer
    @MainThread
    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存储一份
        owner.getLifecycle().addObserver(wrapper);
    }

1.3、setValue 方法

当执行这个方法是,会调用dispatchingValue 方法,通过dispatchingValue调用considerNotify方法,进行发起通知。

 assertMainThread("setValue");
        mVersion++;
        mData = value;
        dispatchingValue(null);

1.4、dispatchingValue方法

初始化不为空的时候considerNotify 执行初始化的更新,否则循环所有mObservers进行更新。

    void dispatchingValue(@Nullable ObserverWrapper initiator) {
        if (mDispatchingValue) {
            mDispatchInvalidated = true;
            return;
        }
        mDispatchingValue = true;
        do {
            mDispatchInvalidated = false;
            if (initiator != null) {
                considerNotify(initiator);
                initiator = null;
            } else {
                for (Iterator<Map.Entry<Observer<? super T>, ObserverWrapper>> iterator =
                        mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
                    considerNotify(iterator.next().getValue());
                    if (mDispatchInvalidated) {
                        break;
                    }
                }
            }
        } while (mDispatchInvalidated);
        mDispatchingValue = false;
    }

1.5、considerNotify方法

执行observer.mObserver.onChanged((T) mData); 方法,发出了通知。

二、LifecycleObserver 接口

2.1、LifecycleEventObserver 接口

定义了onStateChanged方法,来监听状态的变化。

    void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event);
	当onStateChanged方法的Lifecycle.Event发生变化时,执行activeStateChanged方法,这里把它和anroid的activity或fragment生命周期联系起来。mOwner.getLifecycle()这里得到的是Lifecycle 抽象类的枚举State
       @Override
        public void onStateChanged(@NonNull LifecycleOwner source,
                @NonNull Lifecycle.Event event) {
            if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
                removeObserver(mObserver);
                return;
            }
            activeStateChanged(shouldBeActive());
        }

2.2、ObserverWrapper 类

定义了activeStateChanged 方法。实现对mObserver状态的控制。

三、observer类

其实也是observer类。

四、LifecycleOwner 接口

getLifecycle方法,Activity,Fragment都是继承这个接口。
getLifecycle方法 返回 LifecycleRegistry 类。

五、Lifecycle 抽象类 在common包下

这个类,定义了android下的生命周期**Event **,

 @SuppressWarnings("WeakerAccess")
    public enum Event {
        ON_CREATE,
        ON_START,
        ON_RESUME,
        ON_PAUSE,
        ON_STOP,
        ON_DESTROY,
        ON_ANY
    }

getLifecyclegetCurrentState就是得到的这个

@SuppressWarnings("WeakerAccess")
    public enum State {
        DESTROYED,
        INITIALIZED,
        CREATED,
        STARTED,
        RESUMED;
        public boolean isAtLeast(@NonNull State state) {
            return compareTo(state) >= 0;
        }
    }

5.1、LifecycleRegistry 继承于Lifecycle 类

FastSafeIterableMap 用来存储LifecycleBoundObserver对象和ObserverWithState对象。

    private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap =
            new FastSafeIterableMap<>();

你可能感兴趣的:(Android,android)