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)