当前位置: 首页 > news >正文

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);}
  1. 首先判断LifecycleOwner是否为DESTROYED状态,如果是就直接忽略,不能添加。
  2. 其次用LifecycleOwnerobserver 组装成LifecycleBoundObserver包装实例wrapper
  3. 使用putIfAbsent()方法observer-wrapper作为key-value添加到观察者列表mObservers中。不能添加具有不同生命周期的相同观察者,否则会抛异常,但是同owner可以add多个Observer
  4. 最后用LifecycleOwnerLifecycle添加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方法
}

相关文章:

  • 对鸿蒙 Next 系统“成熟论”的深度剖析-优雅草卓伊凡
  • 游戏哪些接口会暴露源IP?_深度解析服务器通信安全隐患
  • 关于 Web 服务器的五个案例
  • 迷你世界UGC3.0脚本Wiki组件说明
  • 进程控制的学习
  • Ubuntu 磁盘空间占用清理(宝塔)
  • 蓝桥杯 16. 密文搜索
  • C# 利用log4net 工作台打印和保存到文件
  • Redis使用总结
  • 从基础到实战的量化交易全流程学习:1.3 数学与统计学基础——概率与统计基础 | 数字特征
  • MIT6.S081 - Lab10 mmap(文件内存映射)
  • 学习笔记—双指针算法—移动零
  • (done) 吴恩达版提示词工程 8. 聊天机器人 (聊天格式设计,上下文内容,点餐机器人)
  • Spark-Streaming2
  • 【Azure Redis 缓存】在Azure Redis中,如何限制只允许Azure App Service访问?
  • Git常用命令简明教程
  • Git 撤回合并提交
  • 在web应用后端接入内容审核——以腾讯云音频审核为例(Go语言示例)
  • Spark Mllib 机器学习
  • 将你的本地项目发布到 GitHub (新手指南)
  • 第二艘国产大型邮轮爱达·花城号完成坞内起浮
  • 人民日报:光荣属于每一个挺膺担当的奋斗者
  • 福建省莆田市原副市长胡国防接受审查调查
  • 玉渊谭天丨“稀土管制让美国慌了”,美军工稀土储备仅够数月
  • 四川公布一起影视盗版案例:1个网站2人团伙盗售30多万部
  • 当哲学与戏剧作为一种生活方式——《人生六戏》分享会