LiveData

一、LiveData 

是一个可被观察的数据持有者,它是具有生命周期感知的数据持有者,只会通知处于Active状态的观察者。

LiveData是一个抽象类,最简单的实现者MutableLiveData

1、基本使用

通过调用LiveData的observer方法,注册观察者

 MutableLiveData<String> mutableLiveData  = new MutableLiveData<>();
        mutableLiveData.observe(this, new Observer<String>() {
            @Override
            public void onChanged(@Nullable final String s) {
                Log.d(TAG, "onChanged1:"+s);
            }
        });

更新数据,会回调observer的onchanged方法

mutableLiveData.postValue("Android进阶之光");

2、LiveData如何观察生命周期

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状态的组件是不允许注册的。

3、postValue/setValue方法分析

   @MainThread //3
    protected void setValue(T value) {
        assertMainThread("setValue");
        mVersion++;
        mData = value;
        dispatchingValue(null);
    }

dispatchingValue 会调用considerNotify方法

private void considerNotify(ObserverWrapper observer) {
        if (!observer.mActive) {//1
            return;
        }
        if (!observer.shouldBeActive()) {
            observer.activeStateChanged(false);//2
            return;
        }
        if (observer.mLastVersion >= mVersion) {
            return;
        }
        observer.mLastVersion = mVersion;
        //noinspection unchecked
        observer.mObserver.onChanged((T) mData);//3
    }

最终会回调LiveData的observer的onchanged方法

参考:Android Jetpack架构组件(五)一文带你了解LiveData(原理篇) - 掘金 (juejin.cn)

 

posted @ 2022-11-02 19:36  随易来了  阅读(121)  评论(0编辑  收藏  举报