美文网首页
Jetpack - LiveData

Jetpack - LiveData

作者: supter川 | 来源:发表于2022-06-20 17:01 被阅读0次

    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<? super T> 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<Map.Entry<Observer<? super T>, 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

          本文链接:https://www.haomeiwen.com/subject/ufqjvrtx.html