jetpack必知必会三 Lifecycle基础使用

在日常开发中,我们有一些耗时任务或者对象需要和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

版权声明:本文为yaobao888原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。