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

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方法
}

http://www.xdnf.cn/news/2439.html

相关文章:

  • Docker小游戏 | 使用Docker部署文字修仙网页小游戏
  • Xray-安全评估工具
  • 月之暗面开源-音频理解、生成和对话生成模型:Kimi-Audio-7B-Instruct
  • 【DNS】BIND9 域名解析快速入门
  • Spring框架的ObjectProvider用法
  • 【C++】类和对象【中上】
  • C++ 完全数
  • Android四大核心组件
  • Linux(Centos版本)中安装Docker
  • 哈希表基础
  • 使用rsync和inotidy-tools来进行实时备份文件夹数据
  • Awesome-Embodied-AI: 具身机器人的资源库
  • CentOS7.9安装Python 3.10.11并包含OpenSSL1.1.1t
  • STM32(M4)入门:定时器延时与系统滴答(价值 3w + 的嵌入式开发指南)
  • uni-app 中使用 mqtt.js 的完整版
  • uniapp: 低功耗蓝牙(BLE)的使用
  • 在winform中使用chromiumWebBrowser显示Echarts图表
  • 【RabbitMQ】保证消息不丢失
  • 汽车网络安全 -- 理解暴露面、攻击面和攻击向量
  • 极狐GitLab 议题权重有什么作用?
  • 编译流程、make命令与nccl-test中的Makefile解析
  • 【Spark入门】Spark简介:分布式计算框架的演进与定位
  • C++?动态内存管理!!!
  • 云计算赋能质检LIMS的价值 质检LIMS系统在云计算企业的创新应用
  • Unity3D Cinemachine 高级应用指南
  • PyDantic入门介绍:Python数据验证与解析的利器
  • 57页PPT|非结构化数据管理方案:从顶层设计到应用实践的系统方法论
  • AVL树的介绍与学习
  • 技能点总结
  • X11安装备忘