Jetpack | Lifecycle 库新旧版本使用姿势对比-灵析社区

IT大鲨鱼

回顾Lifecycle的用处

Lifecycle可以将一个类或组件变成生命周期感知型的,并且可执行相应操作来响应另一个组件(如 activity 和 fragment)的生命周期状态的变化。Lifecycle使得代码更有条理性、精简、易于维护。

Lifecycle中的两个角色

1. LifecycleOwner: 生命周期拥有者,如Activity/Fragment等类都实现了该接口并通过getLifecycle()获得Lifecycle,进而可通过addObserver()添加观察者。

2. LifecycleObserver: 生命周期观察者,实现该接口后就可以添加到Lifecycle中,从而在被观察者类生命周期发生改变时能马上收到通知。

实现LifecycleOwner的生命周期拥有者可与实现LifecycleObserver的观察者完美配合。

老的使用方式(@OnLifecycleEvent 不再推荐使用)

open class MyLifeCycleObserver : LifecycleObserver {    @OnLifecycleEvent(value = Lifecycle.Event.ON_START)    fun connect(owner: LifecycleOwner) {        Log.e(JConsts.LIFE_TAG, "Lifecycle.Event.ON_CREATE:connect")    }    @OnLifecycleEvent(value = Lifecycle.Event.ON_STOP)    fun disConnect() {        Log.e(JConsts.LIFE_TAG, "Lifecycle.Event.ON_DESTROY:disConnect")    }}//Activity中class MainActivity : AppCompatActivity() {      override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_main)        //添加LifecycleObserver观察者        lifecycle.addObserver(MyLifeCycleObserver())    }}

以上就是老的使用方式了,现在已经不推荐使用,@OnLifecycleEvent 注解方式也标记为@Deprecated 了,执行结果很简单就不再贴出来了,有兴趣的可以看开头的文章介绍。另外自定义 LifecycleOwner、Application/Service 中使用 Lifecycle、Lifecycle 原理都不再本文重复介绍了。

新的使用方式(DefaultLifecycleObserver 推荐方式)

open class MyLifeCycleObserver : DefaultLifecycleObserver {    override fun onStart(owner: LifecycleOwner) {        Log.e(KConsts.LIFE_TAG, "Lifecycle.Event.ON_START:connect")    }    override fun onStop(owner: LifecycleOwner) {        Log.e(KConsts.LIFE_TAG, "Lifecycle.Event.ON_STOP:disConnect")    }}//Activity/Fragment中的使用方式不变:lifecycle.addObserver(MyLifeCycleObserver())

可以看到新方式中已经没有 @OnLifecycleEvent 注解,并且没有实现 LifecycleObserver 接口,而是实现了一个叫DefaultLifecycleObserver的接口,来看这个接口的定义: DefaultLifecycleObserver -> FullLifecycleObserver -> LifecycleObserver

//DefaultLifecycleObserver -> FullLifecycleObserver public interface DefaultLifecycleObserver extends FullLifecycleObserver {   @Override default void onCreate(@NonNull LifecycleOwner owner) {}   @Override default void onStart(@NonNull LifecycleOwner owner) {}   @Override default void onResume(@NonNull LifecycleOwner owner) {}   @Override default void onPause(@NonNull LifecycleOwner owner) {}   @Override default void onStop(@NonNull LifecycleOwner owner) {}   @Override default void onDestroy(@NonNull LifecycleOwner owner) {}}// FullLifecycleObserver -> LifecycleObserverinterface FullLifecycleObserver extends LifecycleObserver {    void onCreate(LifecycleOwner owner);    void onStart(LifecycleOwner owner);    void onResume(LifecycleOwner owner);    void onPause(LifecycleOwner owner);    void onStop(LifecycleOwner owner);    void onDestroy(LifecycleOwner owner);}

新的使用方式中,不必自己新增@OnLifecycleEvent 注解的方法了,而只需要实现DefaultLifecycleObserver接口并按需重写对应生命周期的方法即可。

两者对比

LifecycleRegistry负责添加和管理各个LifecycleObserver,最终是从LifecycleOwner中的生命周期Event传到了LifecycleObserver中对应的方法。

在旧的实现方式中,LifecycleObserver的最终实现类是ReflectiveGenericLifecycleObserver(见上图),当调用其对应的onStateChanged()方法后,是通过反射找到对应的@OnLifecycleEvent 注解并调用对应的方法的。那么新的实现方式最后如何调用观察者里对应的方法的呢?


上图只把最后接收事件的地方放出来了,前面的不变,可以看到新方式中没有用到LifecycleEventObserver接口,那么如何触发onStateChanged()回调呢?

来需要个适配器了,一块看下源码中是如何处理的:

addObserver(LifecycleObserver observer) 添加观察者后,如果使用的新的方式,系统会将传入的 FullLifecycleObserver 转换成 FullLifecycleObserverAdapter,从名字看就是一个适配器了,看看里面:

果然,FullLifecycleObserverAdapter 实现了LifecycleEventObserver接口,从而也可以执行onStateChanged()方法了,在onStateChanged()中根据传入的Event事件回调FullLifecycleObserver中对应的生命周期方法,新方式不用再去反射调用,提高了性能。

结论

· Lifecycle 库从 2.4.0-beta01开始,建议使用 DefaultLifecycleObserver方式;

· 如果 @OnLifecycleEvent 与 DefaultLifecycleObserver都写了(一般也不会这么实现),那么会优先走DefaultLifecycleObserver中回调方法,@OnLifecycleEvent 声明的方法不再生效。

阅读量:2008

点赞量:0

收藏量:0