Jetpack Lifecycle 库新旧版本使用姿势对比


在之前的文章中 Android Jetpack系列之Lifecycle 详细介绍了Lifecycle的概念、用法及其实现原理。本文在原来的基础上,来对比新的使用姿势并尝试分析两者的不同。

回顾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 了,执行结果很简单就不再贴出来了,有兴趣的可以看开头的文章介绍。另外自定义 LifecycleOwnerApplication/Service 中使用 LifecycleLifecycle 原理都不再本文重复介绍了。

新的使用方式(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 -> LifecycleObserver
interface 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接口并按需重写对应生命周期的方法即可。

两者对比

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

在旧的实现方式中,LifecycleObserver的最终实现类是ReflectiveGenericLifecycleObserver(见上图),当调用其对应的onStateChanged()方法后,是通过反射找到对应的@OnLifecycleEvent 注解并调用对应的方法的。那么新的实现方式最后如何调用观察者里对应的方法的呢?
新旧方式对比
上图只把最后接收事件的地方放出来了,前面的不变,可以看到新方式中没有用到LifecycleEventObserver接口,那么如何触发onStateChanged()回调呢?看来需要个适配器了,一块看下源码中是如何处理的:

新旧方式对比
addObserver(LifecycleObserver observer) 添加观察者后,如果使用的新的方式,系统会将传入的 FullLifecycleObserver 转换成 FullLifecycleObserverAdapter,从名字看就是一个适配器了,看看里面:
FullLifecycleObserverAdapter
果然,FullLifecycleObserverAdapter 实现了LifecycleEventObserver接口,从而也可以执行onStateChanged()方法了,在onStateChanged()中根据传入的Event事件回调FullLifecycleObserver中对应的生命周期方法,新方式不用再去反射调用,提高了性能。

结论

新版本

  • Lifecycle 库从 2.4.0-beta01开始,建议使用 DefaultLifecycleObserver方式;
  • 如果 @OnLifecycleEventDefaultLifecycleObserver都写了(一般也不会这么实现),那么会优先走DefaultLifecycleObserver中回调方法,@OnLifecycleEvent 声明的方法不再生效。

资料

【1】使用生命周期感知型组件处理生命周期:https://developer.android.com/topic/libraries/architecture/lifecycle?hl=zh-cn
【2】Lifecycle历史版本:https://developer.android.com/jetpack/androidx/releases/lifecycle?hl=zh-cn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_小马快跑_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值