关于LifeCycles组件使用过程中@OnLifecycleEvent注解弃用的替代方法

一、@OnLifecycleEvent注解弃用原因

需要使用代码生成或反射,会造成很大的性能开销。 官方建议使用DefaultLifecycleObserverLifecycleEventObserver来代替。本文使用 DefaultLifecycleObserver来演示替代,LifecycleEventObserver用法基本相同

二、DefaultLifecycleObserver使用方法

DefaultLifecycleObserver是一个实现了LifecycleObserver的接口

关于LifeCycles组件使用过程中@OnLifecycleEvent注解弃用的替代方法_第1张图片

1、这里我先创建一个MyLifecycleListener类实现DefaultLifecycleObeserver接口,并重写其中的对应于生命周期的方法,实际调用时候的代码逻辑就是写在这里的,比如在onCreate中创建动画,onStart中设置开始动画,onPause中设置停止动画,再比如在onCreate创建地图,onResume中重新绘制加载地图,onPause中暂停对地图的绘制,onDestory中销毁地图,原本应该写在Activity中的生命周期调用方法现在都集中在MyLifecycleListener监听类中,大大减少了Activity的代码量,避免了Activity变得过于臃肿,还能做抽象复用

超赞!

class MyLifecycleListener:DefaultLifecycleObserver {
    val TAG="MyLifecycleListener"
    override fun onPause(owner: LifecycleOwner) {
        super.onPause(owner)
        Log.e(TAG, "onPause: ")
    }

    override fun onStart(owner: LifecycleOwner) {
        super.onStart(owner)
        Log.e(TAG, "onStart: ")
    }

    override fun onStop(owner: LifecycleOwner) {
        super.onStop(owner)
        Log.e(TAG, "onStop: ")
    }
}

创建好了MyLifecycleListener监听类之后,就需要在Activity中做调用 调用是通过LifecycleOwner对象来调用的,调用方式是lifecycleOwner.lifecycle.addObserver(MyLifecycleListener()),那LifecycleOwner是什么呢,如果我们的Activity是继承自AppCompatActivity的,或者使用的Fragment是继承自androidx.fragment.app.Fragment,那它们本身就是一个LifecycleOwner对象,也就不需要我们再自己去创建,AndroidX库自动帮我们完成了

class LifecyclesTestActivity: AppCompatActivity() {
    lateinit var myLifecycleListener: MyLifecycleListener
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        myLifecycleListener= MyLifecycleListener()
        //在这里添加观察者之后在Activity中回调生命周期的时候实际调用的就会是
        //我们在MyLifecycleListener类中重写的方法,实现逻辑都在MyLifecycleListener类中重写的方法
        //这样就减轻了Activity的代码体积
        lifecycle.addObserver(myLifecycleListener)
    }
}

三、LifeCycle原理-设计模式之观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己

在上述演示中,lifecycle.addObserver(myLifecycleListener)见名知义也能够看出我们所自定义的MyLifecycleListener类便是观察者,而Activity便是被观察者,被观察者中状态的变化会通知观察者更新状态,所以Activity中生命周期的变化就是借助了观察者模式通知了我们定义的观察者,从而实现在观察者中定义具体逻辑。

注意,观察者完全可以有多个,就像上面提到的使用场景中,我们可以定义有关于创建销毁地图的观察者类,也可以定义关于操作动画的观察者类,还可以定义监听音乐的播放暂停停止的观察者类,这样逻辑上做到了隔离,使各个类的职责分明,也解耦了Activity和业务逻辑代码,而被观察者Activity的变化却能够通知到所有的观察者,所以使用LifeCycle来做与生命周期方法逻辑的实现是很推荐的!

至于LifeCycle对于观察者模式代码层面上的具体实现,本文就不涉及了,有兴趣的小伙伴可以再到网上找找其他博客。

四、LifecycleService组件

拥有生命周期概念的组件,除了Activity和Fragment,还有就是Service,Android提供了一个名为LifecycleService的类,该类继承自Service,并实现LifecycleOwner接口
同时当Service拥有了Lifecycle生命周期后就可以使用LifecycleScope启动协程处理耗时任务。

 

你可能感兴趣的:(android,kotlin,android,jetpack)