在日常开发中,我们有一些耗时任务或者对象需要和Activity或者Fragment的一些生命周期进行关联,以达到资源释放或者任务调度的作用。我们通常的做法是这对应的生命周期函数中执行相关的代码,但是这样一来就会导致需要写很多模板代码,生命周期管理起来也比较麻烦。
Google为了让App开发效率更高,让开发者更加专注在业务代码上,提供了Lifecycle开发组件,该组件提供方便的周期管理方式,开发者可以开发出更加简洁的代码,并且生命周期管理变得更加简单
一、什么是Lifecycle
如开篇我们提到的内容,Lifecycle是Google提供的一套让其他对象可以感知和监听宿主(Activity、Fragment)生命周期的组件库。Lifecycle主要包括三个组件
- LifeCycleOwner 生命周期拥有者,也可以说是宿主,即Activity与Fragment
- LifeCycleObserver 生命周期监听者,可以是任何类
- Lifecycle,存储宿主生命周期信息,监听者可以监听这些信息
二、为什么要用Lifecycle
日常开发中我们可能会遇到这样的场景,需要在Activity或者Fragment的onResume方法调用时开始加载一些数据(有可能是其他启动时会被调用到的周期函数,例如Activity的onCreate),但是为了避免内存泄漏问题,需要在onDestroy方法中停止加载数据的操作。通常的做法是
Task任务加载类
package com.android.jetpackdemo
class Task {
fun start(){
}
fun stop(){
}
}
关联Activity生命周期
class MainActivity : AppCompatActivity() {
val task:Task = Task()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onResume() {
super.onResume()
task.start()
}
override fun onDestroy() {
super.onDestroy()
task.stop()
}
}
这样一来我们当然可以实现想要的效果,但是当我们需要这样处理的任务数量一多,就需要在这类周期函数中进行繁琐且不同的代码绑定,就像我们需要写很多findViewById一样。而且Activity的业务代码会变得很复杂。
三、如何使用Lifecycle
如第二节中我们我使用传统的方式把数据加载任务Task和Activity的生命周期进行了绑定,我们来看一下如何使用Lifecycle进行改造。
3.1、添加依赖
def lifecycle_version = "2.3.1"
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
3.2、改造Task作为监听者
需要实现接口androidx.lifecycle.LifecycleObserver,这是一个无方法的接口。并在start和stop方法上添加上对应的周期注解
class Task : LifecycleObserver {
companion object{
const val TAG = "Task"
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun start(){
Log.d(TAG,"start loading")
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun stop(){
Log.d(TAG,"stop loading")
}
}
3.3、改造Activity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
lifecycle.addObserver(Task())
}
}
经过改造,我们的Activity就会变得很简洁了,少了很多和Activity业务无关的模板代码。
最后在相应的周期函数执行时Task中的方法也会被对应的执行
2021-05-22 22:29:39.694 20244-20244/com.android.jetpackdemo D/Task: start loading
2021-05-22 22:29:43.978 20244-20244/com.android.jetpackdemo D/Task: stop loading