说明
viewmodel 是android 现在推出来的基于观察者模式的数据处理方式。
是在androidx下的lifecycle 包名下面,
一、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 绑定状态。
- wrapper 实现了对状态的绑定
- existing 本地存储一份observer
- 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
}
getLifecycle 的getCurrentState就是得到的这个
@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<>();