从观察者模式的角度分析 Lifecycle-aware components

前言

使用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

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中声明。
与主题相关的类:

  1. .LifeCycle.Event
  2. LifeCycle.State
  3. LifeCycle
  4. LifecycleRegistry(实现了LifeCycle接口)
  5. LifecycleOwner(只有一个方法的接口,返回LifeCycle对象,ComponentActivity,Fragment实现了这个接口)
  6. ReportFragment(发布组件的生命周期状态,在ComponentActivity中实例化)
  7. ComponentActivity
  8. FragmentActivity
  9. AppCompatActivity

观察者

观察者相关类:

  1. LifecycleObserver
  2. GenericLifecycleObserver
  3. ObserverWithState
  4. FullLifecycleObserver
  5. DefaultLifecycleObserver

作为一个观察者,需要介绍的就不多了,谷歌推荐直接继承自DefaultLifecycleObserver,然后在对应的组件状态回调中处理事件即可。

订阅与发布事件

在观察者模式中,主题(Observable)提供接口给观察者(Observer)注册和解注册,所以订阅关系是在 LifeCycle中定义的,LifeCycle是一个抽象类,除了注册和解注册,LifeCycle还定义了枚举Event,和State,它的实例对象是LifecycleRegistry。同理,事件的发布也由主题负责,这就是 LifecycleRegistry 的 handleLifecycleEvent()方法,当Activity(实际是由ReportFragment提供)、Fragment的生命周期发生变化时,通过LifeCycleOwner(它们都实现了这个接口)的getLifeCycle()获得LifeCycle实例,然后调用handleLifecycleEvent(),通知订阅了LifeCycle主题的观察者,组件的生命周期发生变化了。

如何使用

分析了Lifecycle-aware components中各个类在观察者模式中的角色后,要使用这个生命周期感知组件就容易多了,如何使用?

  1. 实现 LifecycleObserver 接口(Google 官方推荐直接继承DefaultLifecycleObserver),定义观察者;
  2. 通过生命周期所有者(LifeCycleOwner),也就是ComponentActivity、FragmentActivity、AppCompatActivity、Fragment(一般都是继承自AppCompatActivity和Fragment)的getLifeCycle()方法,获取主题 LifeCycle;
  3. 使用主题的订阅方法订阅/解订阅,也就是addObserver()、addObserver();
  4. 最后,当然是在你的LifecycleObserver 中的各个生命周期中处理你的业务了。

更多请参考官方文档中的案例。

原创文章 25 获赞 12 访问量 1万+

猜你喜欢

转载自blog.csdn.net/half_bottle/article/details/88564829