0x1、Lifecycle简介
本节继续学穿Jetpack,带来第二个组件 Lifecycle
,用于帮助开发者管理Activity、Fragment的生命周期,它可是LiveData、ViewModel等组件的基石。
日常开发中经常会遇到这些问题:
- 需要在Activity、Fragment的生命周期回调中执行特定操作,否则会引起
程序错误
或内存泄露
,比如:无限循环的属性动画忘记在onDestory中取消,Eventbus忘记在onDestory中unregister等。不要想着自己小心注意就好,在多人协作的场景下,特别是在多人协作的场景下;
- 一种常规解法:写个
基类
,重写生命周期回调方法,把操作代码都堆到各个方法中,以此规避认为的疏忽。可以,但是也导致了基类臃肿不堪,不好维护,而且有些子类被迫继承
一堆不需要的操作;
可能存在不符预期的生命周期情况
,比如onCreate()里发起一个异步回调,但因为回调比较耗时,等到回调时已经处于onStop()状态了,回调里的操作可能没意义了,所以需要拿到当前所处的生命周期状态。
- 一种常规解法:
额外定义一个哨岗值
,在生命周期回调方法中去修改这个值,异步回调根据这个值执行相应操作。
Lifecycle 的出现,就是帮助开发者解决上述问题:
将组件的生命周期状态信息隔离出来统一管理,并允许其他对象进行观察。
0x2、Lifecycle使用
Tips:部分内容搬运自官方文档:《使用生命周期感知型组件处理生命周期》
① 依赖引入
// 非Androidx implementation "android.arch.lifecycle:extensions:1.1.1" // Androidx implementation 'androidx.appcompat:appcompat:1.4.1'
只需依赖一个appcompat即可,打开左侧 External Libraries 可以看到和lifecycle相关的库:
网络异常,图片无法展示
|
键入:gradlew :app:dependencies 查看依赖树,可以看到core、activity等模块都依赖lifecycle了~
网络异常,图片无法展示
|
一般无需额外依赖配置即可使用,当然如果对库版本有要求、或是使用特殊情况下的扩展类,可以单独依赖,如:
// 注解处理器 annotationProcessor "androidx.lifecycle:lifecycle-compiler:2.3.1" // Java 8支持的 DefaultLifecycleObserver implementation "androidx.lifecycle:lifecycle-common-java8:2.3.1" // 实现Service的LifecycleOwner implementation "androidx.lifecycle:lifecycle-service:2.3.1" // ProcessLifecycleOwner给整个app进程提供一个lifecycle implementation "androidx.lifecycle:lifecycle-process:2.3.1" // ReactiveStreams support for LiveData implementation "androidx.lifecycle:lifecycle-reactivestreams:2.3.1"
关于库的版本号及其依赖的库,可到 MVNRepository 输入包名自行查询:
网络异常,图片无法展示
|
Tips:如果单纯只想用Lifecycle,只需引入lifecycle-runtime,不过它一般是跟LiveData、ViewModel一起使用的。
② 基本使用
- 自定义观察者 → 观察者实现
DefaultLifecycleObserver
接口并重写相应方法来监控组件生命周期;
- 组件添加观察者 →
getLifecycle()
获取Lifecycle实例,调用addObserve()
Tips:旧版的写法 → 观察者实现 LifecycleObserver,通过 OnLifecycleEvent注解 的方式添加对应生命周期的方法,但这种写法已经废弃了,文档注释中建议使用 DefaultLifecycleObserver 或者 LifecycleEventObserver。
使用代码示例如下:
网络异常,图片无法展示
|