前言
使用RxJava2有一段时间了,由于没有认真去研究过,一直停留在简单的使用阶段,更准确地说是在Retrofit中配合RxJava2CallAdapter使用RxJava2的强大能力。心血来潮(迫切需要),想了解下RxJava2可能导致的Activity内存泄漏问题。先是看了一下RxLifeCycle,浏览了不少博客,其中有一篇说到,RxLifeCycle的作者已经不推荐使用这个项目了,而推荐另一个项目:AutoDispose,不看不知道,一看果然有理,使用RxLifeCycle,需要继承其提供的基类RxActivity,或者需要在Activity中加入LifecycleProvider。AutoDispose使用就优雅多了,只需要在订阅过程中多加一个方法,如下:
myObservable
.doStuff()
.as(autoDisposable(this)) // The magic
.subscribe(s -> …);
The magic的真相是什么,暂时不去深究,今天要记录的是另一个和它密切相关,Google 推荐的Jetpack中的Lifecycle-aware components,因为AutoDispose就是巧妙地利用了它,优雅地解决了RxJava2可能导致的内存泄漏问题。
Lifecycle-aware components 简介
Lifecycle-aware components perform actions in response to a change in the lifecycle status of another component, such as activities and fragments. These components help you produce better-organized, and often lighter-weight code, that is easier to maintain.
有道翻译一下:Lifecycle-aware components执行操作,以响应另一个组件生命周期状态的更改,例如Activity和Fragment。这些组件可以帮助您生成更有组织、更容易维护的轻量级代码。
熟悉观察者模式的话,看到这里大概可以猜测 LifeCycle 组件的原理是什么了。其实就是一个观察者模式,LifeCycle组件在Activity、Fragment组件的各个生命周期,发布状态变化事件,然后订阅了组件状态改变的观察者就可以收到组件的生命周期变化。需要跟随Activity、Fragment生命周期的对象,可通过订阅Activity,Fragment的生命周期变化,就可以在内部去处理,正如Google文档中提到的定位功能
Lifecycle-aware components 源码分析
既然是从观察者模式的角度来分析Lifecycle-aware components,那么先搞清楚三个关概念,一是事件的主题,而是,事件的观察者,三是观察者订阅主题以及主题发布事件。
主题
在Lifecycle-aware components,主题是 androidx.lifecycle.LifeCycle。主题的内容是Activity、Fragment等组件等生命周期,它们 androidx.lifecycle.LifeCycle.Event中声明。
与主题相关的类:
- .LifeCycle.Event
- LifeCycle.State
- LifeCycle
- LifecycleRegistry(实现了LifeCycle接口)
- LifecycleOwner(只有一个方法的接口,返回LifeCycle对象,ComponentActivity,Fragment实现了这个接口)
- ReportFragment(发布组件的生命周期状态,在ComponentActivity中实例化)
- ComponentActivity
- FragmentActivity
- AppCompatActivity
观察者
观察者相关类:
- LifecycleObserver
- GenericLifecycleObserver
- ObserverWithState
- FullLifecycleObserver
- DefaultLifecycleObserver
作为一个观察者,需要介绍的就不多了,谷歌推荐直接继承自DefaultLifecycleObserver,然后在对应的组件状态回调中处理事件即可。
订阅与发布事件
在观察者模式中,主题(Observable)提供接口给观察者(Observer)注册和解注册,所以订阅关系是在 LifeCycle中定义的,LifeCycle是一个抽象类,除了注册和解注册,LifeCycle还定义了枚举Event,和State,它的实例对象是LifecycleRegistry。同理,事件的发布也由主题负责,这就是 LifecycleRegistry 的 handleLifecycleEvent()方法,当Activity(实际是由ReportFragment提供)、Fragment的生命周期发生变化时,通过LifeCycleOwner(它们都实现了这个接口)的getLifeCycle()获得LifeCycle实例,然后调用handleLifecycleEvent(),通知订阅了LifeCycle主题的观察者,组件的生命周期发生变化了。
如何使用
分析了Lifecycle-aware components中各个类在观察者模式中的角色后,要使用这个生命周期感知组件就容易多了,如何使用?
- 实现 LifecycleObserver 接口(Google 官方推荐直接继承DefaultLifecycleObserver),定义观察者;
- 通过生命周期所有者(LifeCycleOwner),也就是ComponentActivity、FragmentActivity、AppCompatActivity、Fragment(一般都是继承自AppCompatActivity和Fragment)的getLifeCycle()方法,获取主题 LifeCycle;
- 使用主题的订阅方法订阅/解订阅,也就是addObserver()、addObserver();
- 最后,当然是在你的LifecycleObserver 中的各个生命周期中处理你的业务了。
更多请参考官方文档中的案例。