【Android开源框架面试题】谈谈LiveData的生命周期是怎么监听的?

谈谈LiveData的生命周期是怎么监听的? (B站)

这道题想考察什么?

对Jetpack中Lifecycle与LiveData的原理以及两者之间联系的掌握

考察的知识点
  1. Lifecycle原理
  2. LiveData原理
考生应该如何回答

LiveData会持有可被观察的数据。 并且同时它也是一种可感知生命周期的组件,意味着该组件重视其他app组件的生命周期,如Activity、Fragment,该组件能确保,仅仅在Activity\Fragment等组件都处于活跃的生命周期状态的时候,才去更新app组件。

 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;
        }
     	// 使用Lifecycle监听生命周期
        owner.getLifecycle().addObserver(wrapper);
}

可以看到其实LiveData就是借助了Lifecycle感知生命周期的。将LifecycleBoundObserver wrapper添加为观察者,当有生命周期变化时将会执行:onStateChanged

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() {
    
    
            // 如果当前状态为 STARTED或者RESUME则为true
            return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
        }

        @Override
        public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
    
    
            //如果是DESTORY状态,则return
            if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
    
    
                removeObserver(mObserver);
                return;
            }
            //状态变化且不为destory时执行
            activeStateChanged(shouldBeActive());
        }

        @Override
        boolean isAttachedTo(LifecycleOwner owner) {
    
    
            return mOwner == owner;
        }

        @Override
        void detachObserver() {
    
    
            mOwner.getLifecycle().removeObserver(this);
        }
}

activeStateChanged中如果当前改变的状态为活跃状态(shouldBeActive():true),则会调用到considerNotify方法通知数据更新:

private void considerNotify(ObserverWrapper observer) {
    
    
        if (!observer.mActive) {
    
    
            return;
        }

        if (!observer.shouldBeActive()) {
    
    
            observer.activeStateChanged(false);
            return;
        }
    	//如果数据没有变化,无需通知
        if (observer.mLastVersion >= mVersion) {
    
    
            return;
        }
        observer.mLastVersion = mVersion;
        //noinspection unchecked
        observer.mObserver.onChanged((T) mData);
    }

数据在每次修改时,都会进行mVersion++,因此可以使用mVersion判断数据是否发生修改,如果未发生变化则不会发起回调。

//postValue也会最终调用到setValue
protected void setValue(T value) {
    
    
        assertMainThread("setValue");
        mVersion++; // 数据变化标记
        mData = value;
        dispatchingValue(null);
}

所以,LiveData的生命周期是通过Lifecycle监听的,同时LiveData会维护一个mVersion作为数据的版本号。当数据有修改时,才会进行通知回调。

最后

我整理了一套Android面试题合集,除了以上面试题,还包含【Java 基础、集合、多线程、虚拟机、反射、泛型、并发编程、Android四大组件、异步任务和消息机制、UI绘制、性能调优、SDN、第三方框架、设计模式、Kotlin、计算机网络、系统启动流程、Dart、Flutter、算法和数据结构、NDK、H.264、H.265.音频编解码、FFmpeg、OpenMax、OpenCV、OpenGL ES
在这里插入图片描述

有需要的朋友可以扫描下方二维码,免费领取全部面试题+答案解析!!!

猜你喜欢

转载自blog.csdn.net/datian1234/article/details/135175034