【AAC 系列三】深入理解架构组件:LiveData

  1. 通过 setValue()/postValue() 更新数据的处理流程是如何?
  2. 生命周期变化后数据处理流程是怎么样的?

同时提前看下我整理的 LiveData UML 图,对 LiveData 有个整体的了解,后续的涉及到的类都在这里了,有助于理解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图1.LiveData 类图)

OK, here we go!

2.1 LiveData.observe()

LiveData 的使用流程从 observe() 开始,咱们尝试从 observe() 方法 开始分析:

@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer observer) {
//如果是 DESTROYED 的状态则忽略
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// ignore
return;
}
//把 Observer 用 LifecycleBoundObserver 包装起来
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
//缓存起来
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
//如果已经 observe 过 并且两次的 owner 不同则报错
if (existing != null && !existing.isAttachedTo(owner)) {
throw new IllegalArgumentException(“Cannot add the same observer”

  • " with different lifecycles");
    }
    if (existing != null) {
    return;
    }
    //绑定 owner
    owner.getLifecycle().addObserver(wrapper);
    }

可以看到 observe 方法里把我们传递的 observer 用 LifecycleBoundObserver  包装了起来,并且存入了 mObservers  ,并且跟 owner 进行了关联。

并且做了两个特殊处理:

  1. 忽视处于 DESTROYED 的 owner 的注册行为
  2. 将一个 Observer 同时绑定两个 owner 的行为视为非法操作,也即一个 Observer 只能绑定一个 owner,而 owner 可以有多个 Observer;

这里出现了几个新的类 LifecycleBoundObserverObserverWrapper 来看看。

2.2 LifecycleBoundObserver

class LifecycleBoundObserver extends ObserverWrapper implements GenericLifecycleObserver {
@NonNull final LifecycleOwner mOwner;

LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer observer) {
super(observer);
mOwner = owner;
}

@Override
boolean shouldBeActive() {
// 判断 owner 当前的状态是否是至少 STARTED
return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
}

@Override
public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
//生命周期改变,如果是 DESTROYED 就自动解除
if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
removeObserver(mObserver

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值