浅谈下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零基础入门到精通,高手进阶之路

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

相关推荐
诸神黄昏EX18 分钟前
Android Google KEY
android
一起搞IT吧24 分钟前
Android性能系列专题理论之十一:block IO问题分析思路
android·嵌入式硬件·智能手机·性能优化
小妖6661 小时前
怎么用 tauri 创建编译 android 应用程序
android·tauri
逻辑驱动的ken2 小时前
Java高频面试考点场景题20
java·开发语言·深度学习·面试·职场和发展
Wect2 小时前
深度剖析浏览器跨域问题
前端·面试·浏览器
鸟儿不吃草2 小时前
安卓实现左右布局聊天界面
android·开发语言·python
刀法如飞4 小时前
Java数组去重的20种实现方式——指导AI解决不同问题的思路
java·算法·面试
ayqy贾杰4 小时前
Cursor SDK发布!开发者可直接搬走其内核
前端·vue.js·面试
xxjj998a4 小时前
Laravel 1.x:PHP框架的原始魅力
android·php·laravel
formula100004 小时前
在iOS/安卓上远程连接任何 Agent!Claude、Codex、Copilot、Gemini、OpenCode 等
android·copilot