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 包装类,将 owner 和 observer 传了进去
注释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

最低0.47元/天 解锁文章
1715

被折叠的 条评论
为什么被折叠?



