LiveData是什么?
首先贴上官方链接
从字面意思上来看,这个是一个活跃,有生命的数据。那为何活跃?活跃与否从何判断?
先来看这么一个类LifecycleOwner
他是一个生命周期的持有者,做为一个android开发来说,这个对大家来说都不陌生,我们所熟知的Activity,Fragment,他们是有典型的生命周期特征,oncreate,onstart,onpause,onstop,ondestory等等,那他们里面的实现是怎样的呢?我这里稍微介绍一下。
从图中可以看到ComponentActivity实现了LifecycleOwner的接口,返回了一个mLifecycleRegistry对象
这个LifecycleRegistry是继承自一个lifecycle的抽象类,然后作为owner的activity持有这个lifecycle
那具体这个是怎么运作的呢?
在ComponentActivity的oncreate里添加了一个ReportFragment,这个ReportFragment做的事很简单
在他的生命周期里,去做dispatch,分发的操作
很显然,这个ReportFragment拿到当前activity的Lifecycle,也就是上文的mLifecycleRegistry对象去做一个分发的动作
handleLifecycleEvent
这里最终其实走forward或者backward,backward类似一个生命周期的状态控制,一个是状态的前进,一个是状态的后退,有兴趣的可以自己debug研究一下,类似fragment里的有个movetostate方法,然后就走到最后一步 observer.dispatchEvent(lifecycleOwner, event),像观察这个生命组件的观察者分发我当前的event。
前面介绍的差不多,来看看livedata的构造
一个抽象类,最多用的可能是MutableLiveData的这个子类,提供了两个对外的方法postvaule和setvalue,再来看看livedata的用法
LiveData怎么用?
首先新建一个livedata的对象,这里用了MutableLiveData,然后observe方法传入了两个参数 一个是owner,另一个是Observer
来看看他的方法,
@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer super T> observer) {
//要在主线程操作,不然抛异常
assertMainThread("observe");
如果当前owner已经销毁,就不会添加
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// ignore
return;
}
//这里把observer进行了一层包装,类似rxjava用操作符把下游的observer传入到操作符里面的observer,对结果进行处理,判断后在分发给我们传入的observer
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
//把我们添加的observer都放到mObservers这个SafeIterableMap里
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
if (existing != null && !existing.isAttachedTo(owner)) {
throw new IllegalArgumentException("Cannot add the same observer"
+ " with different lifecycles");
}
if (existing != null) {
return;
}
//真正的把我们的owner和包装后的observer关联起来。
owner.getLifecycle().addObserver(wrapper);
}
复制代码
那这个LifecycleBoundObserver的包装起了什么作用呢?
//shouldBeActive()帮我们判断owner的生命周期,大于STARTED时返回true
onStateChanged,在前文owner向observer分发event的最后其实是会调用这个方法,可以理解为任何有生命周期变动,都会触发这个方法,
首先判断owner的生命周期的安全性,然后触发activeStateChanged,而我们刚刚保存observer的集合mObservers就派上用场了,这里会对这里所有的观察者进行一个notify,从owner生命周期的变化到observer的感知,其实这里有很多的判断,比如生命周期是否安全,是否已经触发过(防止重复调用)和version的比对,每次触发修改value值(set or post)的调用都会使内部mVersion自增,并最后赋值给最新的mLastVersion,当校验完成后才会调用到我们的onchange方法,这是作为一个值分发的操作。
而当owner的当前生命周期为DESTROYED的时候,自动会把从mObservers里移除掉,这样就算有一个后台线程持有了这个livedata的引用去进行一个setvalue的操作但是我们的observer回调里是不会受到这个信息的,这样我们可以大胆放心的onchange里去做一些ui上面的操作而不必担心界面销毁所引发各种奇奇怪怪的问题~
出此之外,如果没有lifecycleowner,也可以用observerforever来监听livedata数据的变化,observerforever与observer不同的是他不会自动的remove这个observer,除非你手动调用removeobserver