安卓Jetpack狠活——Lifecycles与LiveData(二)

564 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情,希望大家多多支持,帮忙点个赞,谢谢!

前言

书接上回,我们看过了LiveData的使用,自然也就明白了这玩意虽然好,但不能处处到位,因为需要你自己去post后才能得到,那如何不用在子线程一直苦苦等待就能给人一种在实时更新的感觉呢?那自然要用到我们的狠活——Lifecycle。

image.png 上图可以看出官方指南都是将他们放在一起,所以他们搭在一起,真的是可以说全是科技与狠活,齐活了,我说的这么好,不如实地去看,下面就让我们看看,他们是如何在一起为你Activity生命周期保驾护航。

正篇

image.png 首先,让我们看一则例子,如果我们不用Lifecycle去观察Activity的生命周期,那就得向下面这样: 第一步,先创建一个观察类

class MyObserver {
    fun activityStart() {

    }

    fun activityStop() {

    }
}

第二步,在Activity中相应的生命周期环节中调用方法

class MainActivity : AppCompatActivity() {
    
    lateinit var observer : MyObserver

    override fun onCreate(savedInstanceState: Bundle?) {
        observer = MyObserver()
    }

    override fun onStart() {
        super.onStart()
        observer.activityStart()
    }

    override fun onStop() {
        super.onStop()
        observer.activityStop()
    }
}

这么一通操作下来,我们又是在Activity中重写相应生命周期方法,又是通知给我们的观察类,结果肯定是可以正常运行达到预期效果,但这违背了我们不希望Activity过重的愿景,需要在Activity编写大量逻辑处理了,所以Lifecycle组件闪亮登场。

LifecycleObserver接口

想要使用Lifecycle组件,那么得在我们刚刚写的观察类中实现LifecycleObserver接口

image.png 可以看到这个接口是空方法接口,所以我们直接声明一下即可,无需重写方法,接下来,就是我们需要用到额外的注解功能即能感知我们想要观察的Activity生命周期,如下:

class MyObserver : LifecycleObserver {
        @OnLifecycleEvent(Lifecycle.Event.ON_START)
        fun activityStart() {
            Log.d("MyObserver", "activityStart")
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
        fun activityStop() {
            Log.d("MyObserver", "activityStop")
        }
}

可惜的是这个注解方法已经被丢弃,不推荐使用,原因是这个注解需要使用代码生成或反射,应避免使用,现在推荐的是用DefaultLifecycleObserver或LifecycleEventObserver 。

image.png 所以给出新的写法,支持库 26.1.0 及更高版本中的 Fragment 和 Activity 已实现 LifecycleOwner 接口,我们采用官方推荐的DefaultLifecycleObserver:

class MyObserver : DefaultLifecycleObserver {

    override fun onStart(owner: LifecycleOwner) {
        Log.d("MyObserver", "activityStart")
    }

    override fun onStop(owner: LifecycleOwner) {
        Log.d("MyObserver", "activityStop")
    }
}

addObserver()方法观察

我们接下来要在Activity中调用LifecycleOwner的getLifecycle()方法,获取一个Lifecycle对象,然后使用addObserver()方法去观察LifecycleOwner生命周期,最后传入我们写好的DefaultLifecycleObserver实现类实例即可

class MainActivity : AppCompatActivity() {

    lateinit var viewModel: MainViewModel
    lateinit var sp : SharedPreferences

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        ...
        lifecycle.addObserver(MyObserver())
        ...
    }

}

这样我们就完整的可以观察我们想要的生命周期变化了,运行一下: e3bfc4dbf915861e482c -middle-original.gif

打印出相应日志:

Snipaste_2022-10-19_22-42-46.png

结语

所以只要我们观察对应的Activity生命周期就能去及时更新UI,也就不会出现在下一个页面已经提交数据返回上一页却什么也得不到的尴尬情景发生。