Android LiveData关键代码

1、observer方法

public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
        assertMainThread("observe");
        if (owner.getLifecycle().getCurrentState() == DESTROYED) {
            // ignore
            return;
        }
        LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
        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.getLifecycle().addObserver(wrapper);
    }
  1. 首先判断LifecycleOwner是否为DESTROYED状态,如果是就直接忽略,不能添加。
  2. 其次用LifecycleOwnerobserver 组装成LifecycleBoundObserver包装实例wrapper
  3. 使用putIfAbsent()方法observer-wrapper作为key-value添加到观察者列表mObservers中。不能添加具有不同生命周期的相同观察者,否则会抛异常,但是同owner可以add多个Observer
  4. 最后用LifecycleOwnerLifecycle添加observer的封装wrapper

2、数据存储位置 

private SafeIterableMap<Observer<? super T>, ObserverWrapper> mObservers =
new SafeIterableMap<>();

3、在Lifecycle生命周期结束时移除对应观察者

4、值的更新

protected void setValue(T value) {
    assertMainThread("setValue");	//检查是否在主线程
    mVersion++;	//默认值是-1,每次更新数据都会自增
    mData = value;	//更新的数据赋值给mData
    dispatchingValue(null);	//调用 dispatchingValue()方法并传入null,将数据分发给所有观察者。dispatchingValue如果传入null则是所有的观察者,如果是具体的ObserverWrapper对象,则通知到具体的Observer。
}

protected void postValue(T value) {
    boolean postTask;	//用于判断是否要更新
    //加锁解决多个子线程同时调用问题
    synchronized (mDataLock) {
        postTask = mPendingData == NOT_SET;
        mPendingData = value;	//将数据存入 mPendingData
    }
    if (!postTask) {
        return;
    }
    //通过线程池分发到主线程去处理
    ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
}
private final Runnable mPostValueRunnable = new Runnable() {
    @SuppressWarnings("unchecked")
    @Override
    public void run() {
        Object newValue;
        synchronized (mDataLock) {
            newValue = mPendingData;
            mPendingData = NOT_SET;
        }
        setValue((T) newValue);
    }
};

真正的发送方法是considerNotify()

private void considerNotify(ObserverWrapper observer) {
    //观察者非活跃,直接return
    if (!observer.mActive) {
        return;
    }
   
    //观察者状态活跃,但是当前变为了不可见状态,再调用activeStateChanged方法,并传入false,其内部会再次判断
    if (!observer.shouldBeActive()) {
        observer.activeStateChanged(false);
        return;
    }
    //如果数据版本已经是最新的了,那么直接返回
    if (observer.mLastVersion >= mVersion) {
        return;
    }
    //修改数据版本
    observer.mLastVersion = mVersion;
    observer.mObserver.onChanged((T) mData);//回调真正的mObserver的onChanged方法
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值