浅谈下LiveData的生命周期是怎么监听的

这个问题是来自一位粉丝的投稿,他说他在哔哩哔哩面试的时候遇到了该问题,向我咨询下如何回答。

问题解析

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

less 复制代码
 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

typescript 复制代码
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方法通知数据更新:

kotlin 复制代码
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判断数据是否发生修改,如果未发生变化则不会发起回调。

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

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

怎么样?你学废了吗?

今日分享到此结束,对你有帮助的话,点个赞再走呗,每日一个面试小技巧
关注公众号:Android老皮

解锁 《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版

内容如下

1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔

相关推荐
fanged1 小时前
天马G前端的使用
android·游戏
wxweven1 小时前
校招面试官揭秘:我们到底在寻找什么样的技术人才?
java·面试·校招
聪明的笨猪猪3 小时前
Java Redis “缓存设计”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
聪明的笨猪猪4 小时前
Java Redis “运维”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
苏打水com5 小时前
JavaScript 面试题标准答案模板(对应前文核心考点)
javascript·面试
molong9315 小时前
Kotlin 内联函数、高阶函数、扩展函数
android·开发语言·kotlin
叶辞树6 小时前
Android framework调试和AMS等服务调试
android
慕伏白8 小时前
【慕伏白】Android Studio 无线调试配置
android·ide·android studio
南北是北北9 小时前
JetPack WorkManager
面试
低调小一9 小时前
Kuikly 小白拆解系列 · 第1篇|两棵树直调(Kotlin 构建与原生承载)
android·开发语言·kotlin