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

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

相关推荐
南风微微吹4 分钟前
2026年5月教资面试结构化、试讲真题及答案汇总PDF(中小幼全)
面试·pdf
程序员陆业聪11 分钟前
当AI学会了混淆代码:LLM辅助混淆 vs R8,Android安全的下一个十字路口
android
小江的记录本18 分钟前
【MySQL】《MySQL日志面试背诵版+思维导图》(核心考点 + MySQL 8.0最新优化)
java·数据库·后端·python·sql·mysql·面试
yubin128557092324 分钟前
mysql正则函数REGEXP
android·数据库·mysql
我命由我1234526 分钟前
Android Framework P2 - 开机启动 Zygote 进程、Zygote 的预加载机制
android·java·开发语言·python·java-ee·intellij-idea·zygote
软件测试慧姐31 分钟前
软件测试面试题总结【含答案】
软件测试·测试工具·面试
我命由我1234536 分钟前
Android Framework P1 - 低配学习 Framework 方案、开机启动 Init 进程
android·c语言·c++·学习·android jetpack·android-studio·android runtime
aqi001 小时前
FFmpeg开发笔记(一百零二)国产的音视频移动开源工具FFmpegAndroid
android·ffmpeg·kotlin·音视频·直播·流媒体
星间都市山脉1 小时前
Android 谷歌 CTS 完整测试
android
nianniannnn1 小时前
快应用day2项目架构
android·快应用