Jetpack 热门组件 LiveData 的生命周期是如何变化的?

LiveData 是什么?

LiveData 是 Jetpack 推出的基于观察者的消息订阅/分发的可观察数据组件,具有宿主(Activity、Fragment)生命周期感知能力,这种感知能力可确保 LiveData 仅分发消息给处于活跃状态的观察者,即只有处于活跃状态的观察者才能收到消息

LiveData 的事件分发机制,会根据监听者的活跃状态来判断是否分发数据源变化事件,这样的话,我们就能避免当前页面在后台时,响应了事件,做出一些无用的逻辑浪费性能

LiveData 的简单使用

LiveData 的使用十分方便,只需要简单的三步:

1、创建 LiveData 对象,LiveData 是抽象类,所以需要创建它的子类 MutableLiveData;

2、设置观察者 observe,第一个参数是 LifecycleOwner 对象,第二个是观察者监听,当数据改变的时候会在 onChanged 方法内做出响应;

3、设置数据,通过 postValue 或者 setValue 方法来更新数据;

LiveData 生命周期

LiveData 如何观察组件生命周期变化

通过调用 LiveData 的 observe 方法来注册观察者,LiveData 的 observe 方法如下所示

 @MainThread
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
   
        assertMainThread("observe");
        //如果被观察者的当前的状态是DESTROYED,就return
        if (owner.getLifecycle().getCurrentState() == DESTROYED) {
   //1
            return;
        }
        LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);//2
        ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);//3
        if (existing != null && !existing.isAttachedTo(owner)) {
   
            throw new IllegalArgumentException("Cannot add the same observer"
                    + " with different lifecycles");
        }
        if (existing != null) {
   
            return;
        }
        owner.getLifecycle().addObserver(wrapper);//4
    }

注释1处的 owner 实际上就是注册时传进来组件,比如 Activity,获取组件当前的状态,如果状态为 DESTROYED,那么直接 return,这说明 DESTROYED 状态的组件是不允许注册的

注释2处新建了一个 LifecycleBoundObserver 包装类,将 ownerobserver 传了进去

注释3处将 observer 和 LifecycleBoundObserver 存储到 SafeIterableMap<Observer<? super T>, ObserverWrapper>mObservers

  • putIfAbsent 方法和 put 方法有区别

如果传入 key 对应的 value 已经存在,就返回存在的 value,不进行替换。如果不存在,就添加 key 和 value,返回 null

如果等于 null,在注释4处会将 LifecycleBoundObserver 添加到 Lifecycle 中完成注册,这样当我们调用 LiveData 的 observe 方法时,实际上是 LiveData 内部完成了 Lifecycle的观察者的添加

  • 这样 LiveData 自然也就有了观察组件生命周期变化的能力

LiveData 的 observe 方法回调

LifecycleBoundObservers是LiveData的内部类,代码如下所示

 class LifecycleBoundObserver extends ObserverWrapper implements GenericLifecycleObserver {
   
        @NonNull final LifecycleOwner mOwner;

        LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer<? super T> observer) {
   
            super(observer);
            mOwner = owner;
        }

        @Override
        boolean shouldBeActive() {
   
            return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
        }

        @Override
        public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
   
            if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
   
                removeObserver(mObserver);//1
                return;
            }
            activeStateChanged
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>