7、JetPack之Lifecycle

1.介绍:可以让逻辑层感知到view层的生命周期变化,并进行相应的逻辑处理

2.基本使用

2.1.1 被动的通知View层生命周期变化 让逻辑层拥有LifecycleOwner对象,因为view层实现了LifecycleOwner接口,所以可以在view层初始化的时候,直接赋值,有了LifecycleOwner对象,就可以通过getLifecycle方法获取到Lifecycle对象了

2.1.2 有了LifecycleOwner对象,需要在逻辑层获取Lifecycle并添加对应的观察者(addObserver),这里的观察者要实现LifecycleObserver接口,下文的LifecycleEventObserver是其子类,当view生命周期发生变化时,会调用onStateChanged方法,处理相应的业务逻辑,使用起来超级方便

2.2.1 主动的获取状态,通过注解的方式进行

首先在逻辑层对想要观察的数据进行监听

其次,在View层添加数据的监听者,传入LifecycleOwner,为了获取到Lifecycle

 得到Lifecycle后,给lifecycle添加observer,通过addObserver方法,被观察的对象需要实现LifecycleObserver接口,该接口没有具体的方法

 实现了LifecycleObserver接口的类,可以通过注解的方式,主动获取到view层生命周期的变化,当view生命周期变化时,会调用注解下面的方法

3.解读源码 

3.1 首先在ComponentActivity中实现了LifecycleOwner接口,这样所有的activity、fragment都实现了LifecycleOwner接口

 而该接口只有一个功能,那就是获取Lifecycle对象,因为毕竟是通过Lifecycle来让逻辑层感知View层的生命周期的

 在ComponentActivity中实现了LifecycleOwner接口的getLifecycle方法,获取到的是一个LifecycleRegistry对象

 下面我们就看看LifecycleRegistry干了什么,首先是继承Lifecycle,并且在构造方法中,初始状态为INITIALIZED状态

 Events又是怎么来的呢

3.2 在FragmentActivity中复写了Lifecycle getLifecycle() 方法

 在FragemntActivity中的各个生命周期中会通过hadleLifecycleEvent方法处理相应的事件,这样就将view层的生命周期变化通过事件传到了Lifecycle的实例对象mFragmentLifecycleRegistry中

 这里的Event只是Lifecycle中的一个枚举类,列举各种生命周期

 通过getStateAfter方法将相应的事件转换为State,然后通过moveToState方法保存到mState中

 基于此,Lifecycle便能感受到view的生命周期的变化

那么,Lifecyle又如何通知observer观察者(这个观察者一般在逻辑层添加)view的生命周期的变化呢?

被动通知方式:首先在逻辑层通过Lifecycle的addObserver方法添加实现了LifecycleEventObserver接口的mViewLifeImpl

 通过addObserver方法,将观察者对象添加到LifecycleRegistry的mObsercerMap集合中去

 这样根据前文,view生命周期变化时,会处理相应的事件

在moveToState中会调用sync同步方法 

 这里主要看下backwardPass和forwardPass方法,逻辑是类似的,主要一个是正序,一个是逆序

 这里主要看下forwardPass方法,在while循环中,会在mObserverMap集合中循环拿到所有添加进来的观察者observer,然后调用dispatchEvent处理事件

 这里掉调到了dispatchEvent方法,mLifecycleObserver便是添加的一个个观察者,经过ObserverWithState类进行包装了一下,最终调到了mLifecycleObserver.onStateChanged方法

 即最终调到了我们自定义,实现了LifecycleEventObserver接口的onStateChanged方法,完成了Lifecycle对添加的观察者进行view生命变化的通知(被动通知)

 主动通知方式:通过@OnLifecycleEvent注解

前边两种添加观察者的方式,一个是添加了LifecycleEventObserver, 一个是添加了LifecycleObserver,其中LifecycleEventObserver是LifecycleObserver子类

 这种添加实现了LifecycleObserver接口的方式,同样的使用Lifecycle的addObserver方法

 但在LifecycleEventObserver lifecycleEventObserver方法中,会返回不同的对象,如果添加进来的观察者是实现了LifecycleEventObserver对象,会返回(LifecycleEventObserver) object,如果是实现了LifecycleObserver接口的对象,会返回new ReflectiveGenericLifecycleObserver(object)对象

@NonNull
    static LifecycleEventObserver lifecycleEventObserver(Object object) {
        boolean isLifecycleEventObserver = object instanceof LifecycleEventObserver;
        boolean isFullLifecycleObserver = object instanceof FullLifecycleObserver;
        if (isLifecycleEventObserver && isFullLifecycleObserver) {
            return new FullLifecycleObserverAdapter((FullLifecycleObserver) object,
                    (LifecycleEventObserver) object);
        }
        if (isFullLifecycleObserver) {
            return new FullLifecycleObserverAdapter((FullLifecycleObserver) object, null);
        }

        if (isLifecycleEventObserver) {
            return (LifecycleEventObserver) object;
        }

        final Class<?> klass = object.getClass();
        int type = getObserverConstructorType(klass);
        if (type == GENERATED_CALLBACK) {
            List<Constructor<? extends GeneratedAdapter>> constructors =
                    sClassToAdapters.get(klass);
            if (constructors.size() == 1) {
                GeneratedAdapter generatedAdapter = createGeneratedAdapter(
                        constructors.get(0), object);
                return new SingleGeneratedAdapterObserver(generatedAdapter);
            }
            GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];
            for (int i = 0; i < constructors.size(); i++) {
                adapters[i] = createGeneratedAdapter(constructors.get(i), object);
            }
            return new CompositeGeneratedAdaptersObserver(adapters);
        }
        return new ReflectiveGenericLifecycleObserver(object);

获取type

 

而ReflectiveGenericLifecycleObserver是 LifecycleEventObserver的子类,并复写了LifecycleEventObserver的onStateChanged方法

添加完成之后和前面一样 

因为返回是ReflectiveGenericLifecycleObserver,所以这里的onStateChanged方法是ReflectiveGenericLifecycleObserver实现的

 这样就实现了基于注解的方式,让view的生命周期通过lifecycle传递给观察者

PS:可以在方法上加上值参,获取当前的owner和event

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值