【Jetpack】学穿:Lifecycle → 生命周期 (原理篇)(中)

简介: 本质上是围绕着这两个设计模式进行的: 模板模式 → 定义算法骨架,对外开放扩展点,基于 继承 关系实现,子类重写父类抽象方法; 观察者模式 → 对象间定义一对多的依赖,当一个对象状态发生改变,依赖对象都会自动收到通知;

⑥ Lifecycling类


将传入的 LifecycleObserver 进行类型包装,生成一个新的 LifecycleEventObserver 实例,使得Event分发过程可以统一入口。直接关注 lifecycleEventObserver()


网络异常,图片无法展示
|


看下 FullLifecycleObserverAdapter


网络异常,图片无法展示
|


就是套了一层,保证先执行FullLifecycleObserver的回调,再执行LifecycleEventObserver的回调。


注解反射相关的暂且不看,基于OnLifecycleEvent注解方式进行回调,是面向基于Java 7作为编译版本的平台,现在基本都Java 8了,甚至有些玩Compose的都已经用上Java 11了。注释也有说,只是为了兼容保留,后续会逐步废弃。


lifecycle-common包看得差不多了,接下来看另一个~


0x3、lifecycle-runtime 源码解读


lifecycle-runtime 包含下述四个文件:


网络异常,图片无法展示
|


① LifecycleRegistry类


整个包里最重要的一个类,可看作 具体被观察者,常规玩法都是:


定义一个集合,存所有观察者,事件产生时,迭代集合,调用观察者对应的回调方法。


但在这里,逻辑变得更复杂了,因为还涉及到了 状态管理,还得考虑这些问题:


  • ① 有事件产生迭代观察者集合时,可能增删集合中的观察者 → 集合需要支持迭代时增删元素 → 你像ArrayList就不行,for迭代时移除元素会报ConcurrentModificationException;
  • ② 处理事件回调时,新加入的观察者该如何处理?该设置为什么状态?要不要也进行回调?
  • ③ 如果移除观察者呢?状态要更新吗?还是直接忽略?等等...


心中埋下这些问题的种子,然后开始跟源码,先是这个支持迭代时增删元素的集合:


网络异常,图片无法展示
|


一眼就看到这个 FastSafeIterableMap,点开类,注释说到:


简陋版的LinkedHashMap,支持遍历时的元素删除,比SafeIterableMap占用更多内存,非线程安全


他继承 SafeIterableMap(链表实现) 类,并重写了这四个方法


网络异常,图片无法展示
|


空间换时间,就是套了一层HashMap,使得 查找起来会更快 而已,接着看 SafeIterableMap


网络异常,图片无法展示
|


定义了头、尾Entry,存迭代器的WeakHashMap,节点计数器,看下 Entry


网络异常,图片无法展示
|


就是每个独立的 节点,里面除了key,value外,还有前后节点的引用,继续看get()、和put():


网络异常,图片无法展示
|


单链表的常规操作了,而 putIfAbsent() 更简单,就是调get(),拿到元素直接返回,拿不到put()插入元素。


回到关注点:遍历时删除元素,跟下 remove()


网络异常,图片无法展示
|


跟下 supportRemove()


网络异常,图片无法展示
|


关于迭代器具体的添加和删除,提供三个具体实现类:


  • AscendingIterator(升序)
  • DescendingIterator(降序)
  • IteratorWithAdditions(还支持添加元素)


就不去抠了,在调用 iterator() 获得迭代器时,都会把迭代器添加到集合中:


网络异常,图片无法展示
|


移除的话就不牢费心了,因为是弱引用,GC会自动回收,关于这个迭代时可增删元素的集合就了解到这。看回LifecycleRegistry:


网络异常,图片无法展示
|


key是LifecycleObserver,Value是 ObserverWithState,看看定义:


网络异常,图片无法展示
|


就是状态与观察者进行关联,并提供统一的事件分发入口,接着看下啥时候加集合里了,搜下 putIfAbsent 定位到了 addObserver()


网络异常,图片无法展示
|


大体了解流程,有疑惑的应该是这个 可重入标记sync()同步,看看都同步的啥吧:


网络异常,图片无法展示
|


看下降级、升级同步对应的两个方法:


网络异常,图片无法展示
|


所以sync()做的事情就是:让所有观察者完成状态迁移,并完成相应的事件分发,而同步完成的判断依据就是:首尾节点是否相等


除了addObserver()添加新Observer时会同步外,在生命周期事件迁移时也会同步,定位到:


网络异常,图片无法展示
|


相关文章
|
11月前
|
Java API Android开发
Jetpack 之 LifeCycle 组件原理解析
1. LifeCycle 是如何监听到 Activity/Fragment 生命周期变化的? 2. LifeCycle 如何将生命周期变化的事件分发给观察者的?
86 0
Jetpack 之 LifeCycle 组件原理解析
|
11月前
|
Java API 开发工具
Jetpack 之 LifeCycle 组件使用详解
LifeCycle 是一个可以感知宿主生命周期变化的组件。常见的宿主包括 Activity/Fragment、Service 和 Application。LifeCycle 会持有宿主的生命周期状态的信息,当宿主生命周期发生变化时,会通知监听宿主的观察者。
67 0
Jetpack 之 LifeCycle 组件使用详解
|
安全 Android开发
Android Jetpack系列之Lifecycle
`Lifecycle`可以让某一个类变成`Activity`、`Fragment`的生命周期观察者类,监听其生命周期的变化并可以做出响应。`Lifecycle`使得代码更有条理性、精简、易于维护。
|
安全 API 调度
Jetpack 系列(1)—— Lifecycle:生命周期感知型组件的基础
Jetpack 系列(1)—— Lifecycle:生命周期感知型组件的基础
238 0
Jetpack 系列(1)—— Lifecycle:生命周期感知型组件的基础
|
缓存 前端开发 Java
2022 · 让我带你Jetpack架构组件从入门到精通 — Lifecycle
不是标题党!作者会尽力把文章写的更容易理解也更充满深度,本文也随作者的持续学习,持续更新,有问题欢迎在评论区提出~
|
API Android开发 Kotlin
【Jetpack】学穿:Activity Results API(下)
【Jetpack】学穿:Activity Results API
309 0
|
4月前
|
Android开发 开发者
什么是Android Jetpack,它包括哪些组件?
什么是Android Jetpack,它包括哪些组件?
42 0
|
4月前
|
IDE API 开发工具
Google I/O :Android Jetpack 最新变化(四)Compose
Google I/O :Android Jetpack 最新变化(四)Compose
109 0
|
4月前
|
JSON IDE 测试技术
Google I/O :Android Jetpack 最新变化(二) Performance
Google I/O :Android Jetpack 最新变化(二) Performance
114 0