ViewModel:

负责为关联UI(activity/fragment)进行数据管理,业务逻辑处理。不直接持有view引用,不对UI进行访问调用操作

对外通过暴露Livedata方式响应处理结果

LiveData:

可感知组件生命周期、被观察的数据源,在数据发生改变时进行通知提醒

ViewModel处理数据后使用LiveData通知到observer数据已变更,

Lifecycle:
对象or组件生命周期状态定义接口,实现子类LifecycleRegistry。包含LifeCycleOwer和LifecycleObserver,分别是生命周期所有者和生命周期感知者

Lifecycle定义组件状态

ViewModel创建存储流程:

组件与Livedata,Observer,Lifecycle关联流程:

 Livedata observe()

@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {//已销毁组件不作处理
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// ignore
return;
}
//包装observer包含组件生命状态监控的LifecycleBoundObserver
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;
}
//添加到Lifecyvle内保存
owner.getLifecycle().addObserver(wrapper);
}

LiveData 添加LifecycleBoundObserver到LifecycleRegister内处理:

public class LifecycleRegistry extends Lifecycle {

@Override
public void addObserver(LifecycleObserver observer) {
State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
//通过ObserverWithState包装LifecycleObserver内部进行操作管理
ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
......
}
......

ObserverWithState负责分发组件状态变化,与关联的LifecycleBoundObserver状态关联

 static class ObserverWithState {
State mState;
GenericLifecycleObserver mLifecycleObserver; ObserverWithState(LifecycleObserver observer, State initialState) {
mLifecycleObserver = Lifecycling.getCallback(observer);
mState = initialState;
}
//分发组件状态到所关联Observer
void dispatchEvent(LifecycleOwner owner, Event event) {
State newState = getStateAfter(event);
mState = min(mState, newState);
mLifecycleObserver.onStateChanged(owner, event);
mState = newState;
}
}

看一下 LifecycleBoundObserver内部代码

class LifecycleBoundObserver extends ObserverWrapper implements GenericLifecycleObserver {
@NonNull final LifecycleOwner mOwner; LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer<T> observer) {
super(observer);
mOwner = owner;
}
......
//当组件周期状态变化时,处理关联的Observer
@Override
public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
removeObserver(mObserver);
return;
}
activeStateChanged(shouldBeActive());
}
......
} private abstract class ObserverWrapper {
final Observer<T> mObserver;
boolean mActive;
int mLastVersion = START_VERSION; ObserverWrapper(Observer<T> observer) {
mObserver = observer;
}
......
void activeStateChanged(boolean newActive) {//组件周期变化时判断是否需要重新分发value data
if (newActive == mActive) {//observe与组件状态一致时不处理,
return;
}
// immediately set active state, so we'd never dispatch anything to inactive
// owner
mActive = newActive;
boolean wasInactive = LiveData.this.mActiveCount == 0;
LiveData.this.mActiveCount += mActive ? 1 : -1;
if (wasInactive && mActive) {//LiveData从非活跃到激活状态
onActive();
}
if (LiveData.this.mActiveCount == 0 && !mActive) {//LiveData从激活到非活跃状态
onInactive();
}
if (mActive) {//组件激活状态时重新分发上一次存留数据
dispatchingValue(this);
}
}
}

LifeData分发数据处理:

setValue修改数据

@MainThread
protected void setValue(T value) {
assertMainThread("setValue");//主线程调用
mVersion++;//每次修改,版本号+1
mData = value;
dispatchingValue(null);//数据分发处理
} private void dispatchingValue(@Nullable ObserverWrapper initiator) {
if (mDispatchingValue) {
mDispatchInvalidated = true;
return;
}
mDispatchingValue = true;
do {
mDispatchInvalidated = false;
if (initiator != null) {//分发给指定observer
considerNotify(initiator);
initiator = null;
} else {//分发Observer列表内所有注册对象
for (Iterator<Map.Entry<Observer<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;
} // 是否为active状态
if (!observer.shouldBeActive()) {
observer.activeStateChanged(false);
return;
}//observer dataVersion大于等于LiveData dataVersion不予处理
if (observer.mLastVersion >= mVersion) {
return;
}
observer.mLastVersion = mVersion;
//通知Observer change数据
observer.mObserver.onChanged((T) mData);
}

整体大致流程:

最新文章

  1. (转) Android开发性能优化简介
  2. win7 打印机共享
  3. (二)sql入门 管理数据库对象
  4. [转] Loren on the Art of MATLAB
  5. mac下有道词典用不了
  6. JSONObject和JSONArray的关系
  7. nginx编译安装
  8. C语言 常用单词
  9. Linux内核与根文件系统的关系
  10. poj 3620 Avoid The Lakes【简单dfs】
  11. Monkeyrunner入门示例
  12. Hibernate常用Annotation标签说明
  13. (简单) POJ 3667 Hotel,线段树+区间合并。
  14. 按ctrl + c 播放下一曲音乐
  15. npm由来和作用
  16. Asp.Net T4模板生成三层架构
  17. opengl 教程(24) shadow mapping (2)
  18. 蒙特卡洛模拟(Monte Carlo simulation)
  19. Python 为什么sys.stdout.write 输出时后面总跟一个数字
  20. 玩转X-CTR100 l STM32F4 l OLED显示-SSD1306无字库

热门文章

  1. 单例模式及pickle序列化模块
  2. 实用!7个强大的Python机器学习库!⛵
  3. [深度学习] Pytorch模型转换为onnx模型笔记
  4. Cert Manager 申请SSL证书流程及相关概念-三
  5. for循環,逗號運算符,其他(+= -= *= /=)
  6. 日常JS数据各种操作方法总结~~欢迎大家留言板补充哦~~
  7. CTFshow刷题记录
  8. 练习:集合元素处理(传统方式)-练习:集合元素处理(Stream方式)
  9. ASP.NET Core中间件之理解
  10. QuartzNet在winform中使用(目前版本3.6)