您当前的位置: 首页 >  android jetpack

Android技术栈

暂无认证

  • 2浏览

    0关注

    111博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Android Jetpack系列(四):LiveData (原理篇)

Android技术栈 发布时间:2022-07-30 19:28:05 ,浏览量:2

前言

在上一篇文章中我们学习了LiveData的基本用法, 我们知道LiveData是一个可观察的数据持有者,他是具有组件生命周期感知的,那么它是如何观察组件生命周期变化的呢?

LiveData和RxJava的不同的是,LiveData并不是通知所有观察者,它只会通知处于Active状态的观察者; 如果一个观察者处于DESTROYED状态,它将不会收到通知,这一点又是如何做到的?还有另外一点,Transformations的map方法其内部进行了什么操作?等等问题,会在这篇文章中给大家进行讲解

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

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

 @MainThread
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer 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包装类,将owner和observer传了进去

注释3处将observer和LifecycleBoundObserver存储到SafeIterableMap

关注
打赏
1665219970
查看更多评论
0.0393s