Jetpack - LiveData

LiveData:生命周期感知和数据观察能力

  1. 感知生命周期
    Jetpack引入看Lifecycle方便其他组件感知生命周期,只需实现LifecycleEventObserver接口并注册生命周期对象,LiveData内部封装了一个LifecycleBoundObserver对象
class LifecycleBoundObserver extends ObserverWrapper implements LifecycleEventObserver

实现LifecycleEventObserver接口,赋予生命周期感知能力
2.继承ObserverWrapper对象,数据观察着封装类,赋予数据观察能力

当调用observe(LifecycleOwner,Observer)需要2个参数,数据观察者和生命周期拥有者进行绑定
参数1:LifecycleOwner生命周期持有者(一般是activity或Fragment,都默认实现了LifecycleOwner接口)
参数2:Observer数据观察者

public void observe(@NonNull LifecycleOwner owner, @NonNull Observer observer) {
        assertMainThread("observe");
        //过滤生命周期状态是已销毁
        if (owner.getLifecycle().getCurrentState() == DESTROYED) {
            // ignore
            return;
        }
      //生命周期持有者和数据观察者包装成LifecycleBoundObserver
        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);
    }

LiveData怎么避免内存泄露的

liveData监听数据变化通常到写法,在activity或fragment中

mViewModel.mData.observe(this) {
        //Observer对象,更新UI逻辑
}

Observer是匿名内部类,Observer会持有activity或fragment的引用,同时Observer会被LiveData持有,LiveData被ViewMode持有,而ViewModel比activity生命周期长,如果activity生命周期结束了没有移除Observer就会导致内存泄漏,
LiveData帮我们处理了这个问题,在LiveData内部类中LifecycleBoundObserver感知生命周期的变化,当生命周期是销毁状态时自动移除了observer

 @Override
 public void onStateChanged(@NonNull LifecycleOwner source,@NonNull Lifecycle.Event event) {
            //生命周期状态发生改变时回调
            if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
                //界面的生命周期状态时销毁状态
                removeObserver(mObserver);
                return;
            }
            activeStateChanged(shouldBeActive());
        }

LiveData.setValue()流程

@MainThread
    protected void setValue(T value) {
        assertMainThread("setValue");
        //数据版本号
        mVersion++;
        //数据
        mData = value;
        //分发数据
        dispatchingValue(null);
    }

dispatchingValue

void dispatchingValue(@Nullable ObserverWrapper initiator) {
    ...
    for (Iterator, ObserverWrapper>>iterator =mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
          //遍历所有的观察者
          considerNotify(iterator.next().getValue());       
     }
    ...
 }

considerNotify通知数据变化
通知条件
1数据观察者是否活跃
2数据观察者绑定的生命周期组件是否活跃
3数据的版本号是否是最新的

private void considerNotify(ObserverWrapper observer) {
        //观察者是否是活跃状态
        if (!observer.mActive) {
            return;
        }
        //观察者绑定的生命周期组件是否是活跃的
        if (!observer.shouldBeActive()) {
            observer.activeStateChanged(false);
            return;
        }
        //数据版本号是最新的,不分发数据(setValue时mVersion++了)
        if (observer.mLastVersion >= mVersion) {
            return;
        }
        //更新版本号
        observer.mLastVersion = mVersion;
        //分发数据
        observer.mObserver.onChanged((T) mData);
    }

你可能感兴趣的:(Jetpack - LiveData)