@OnLifecycleEnvent 被废弃,替代方案更简单

您所在的位置:网站首页 lifecycler @OnLifecycleEnvent 被废弃,替代方案更简单

@OnLifecycleEnvent 被废弃,替代方案更简单

2023-09-07 00:39| 来源: 网络整理| 查看: 265

近期 androidx.lifecycle 发布了 2.4.0 版本,此次更新中 @OnLifecycleEvent 注解被废弃,官方建议使用 LifecycleEventObserver 或者 DefaultLifecycleObserver 替代

现代的 Android 应用中都少不了 Lifecycle 的身影,正是各种 lifecycle-aware 组件的存在保证了程序的健壮性。

Lifecycle 本质是一个观察者模式的最佳实践,通过实现 LifecycleObserver 接口,开发者可以自自定 lifecycle-aware 组件,感知 Activity 或 Fragment 等 LifecycleOwner 的生命周期回调。

趁新版本发布之际,我们再回顾一下 Lifecycle 注解的使用以及废弃后的替代方案

Lifecycle Events & States

Lifecyce 使用两组枚举分别定义了 Event 和 State。

Events ON_CREATE ON_START ON_RESUME ON_PAUSE ON_STOP ON_DESTROY ON_ANY States INITIALIZED CREATED STARTED RESUMED DESTROYED

Events 对应了 Activity 等原生系统组件的生命后期回调, 每当 Event 发生时意味着这些 LifecycleOwner 进入到一个新的 State。

作为 观察者的 LifecycleObserver 可以感知到 被观察者的 LifecycleOwner 其生命周期 State 变化时的 Event。

定义一个 LifecycleObserver 常用以下两种方式:

实现 LifecycleEventObserver 接口 使用 @OnLifecycleEvent 注解 实现 LifecycleEventObserver public interface LifecycleEventObserver extends LifecycleObserver { void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event); }

LifecycleEventObserver 是一个单方法接口,在 Kotlin 中可转为写法更简洁的 Lambda 进行声明

val myEventObserver = LifecycleEventObserver { source, event -> when(event) { Lifecycle.Event.ON_CREATE -> TODO() Lifecycle.Event.ON_START -> TODO() else -> TODO() } }

LifecycleEventObserver 本身就是 LifecycleObserver 的派生,使用时直接 addObserver 到 LivecycleOwner 的 Lifecycle 即可。

需要在 onStateChanged 中写 swich / case 自己分发事件。相对于习惯重写 Activity 或者 Fragment 的 onCreate, onResume 等方法,稍显啰嗦。

因此 Lifecycle 给我们准备了 @OnLifecycleEvent 注解

使用 @OnLifecycleEvent 注解

使用方法很简单,继承 LifecycleObserver 接口,然后在成员方法上添加注解即可

val myEventObserver = object : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) fun onStart() { TODO() } @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) fun onCreat() { TODO() } }

添加注册后,到 LifecycleOwner 的 Event 分发时,会自动回调注解匹配的成员方法,由于省去了手动 switch/case 的过程,深受开发者喜欢

注解解析过程

Event 分发时,怎么就会回到到注解对应的方法的?

通过 addObserver 添加的 LifecycleObserver ,都会转为一个 LifecycleEventObserver ,LifecycleOwner 通过调用其 onStateChanged 分发 Event

在 Lifecycling#lifecycleEventObserver 中处理转换

public class Lifecycling { @NonNull static LifecycleEventObserver lifecycleEventObserver(Object object) { boolean isLifecycleEventObserver = object instanceof LifecycleEventObserver; boolean isFullLifecycleObserver = object instanceof FullLifecycleObserver; // 观察者是 FullLifecycleObserver if (isLifecycleEventObserver && isFullLifecycleObserver) { return new FullLifecycleObserverAdapter((FullLifecycleObserver) object, (LifecycleEventObserver) object); } // 观察者是 LifecycleEventObserver if (isFullLifecycleObserver) { return new FullLifecycleObserverAdapter((FullLifecycleObserver) object, null); } if (isLifecycleEventObserver) { return (LifecycleEventObserver) object; } final Class klass = object.getClass(); int type = getObserverConstructorType(klass); // 观察者是通过 apt 产生的类 if (type == GENERATED_CALLBACK) { List


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3