news 2026/4/15 11:31:05

Android 内存泄漏 -> LiveData如何解决ViewMode和Activity/Fragment之间的内存泄漏

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android 内存泄漏 -> LiveData如何解决ViewMode和Activity/Fragment之间的内存泄漏

LiveData是如何解决的?(源码分析)

LiveData没有直接持有Activity,而是持有了一个Observer(观察者),而这个Observer被包装在一个 生命周期感知器 中。

核心机制: 当Activity变为DESTROYED状态时,LiveData会自动把自己从观察者列表中移除。引用链断裂,Activity就可以被回收了。

observe方法:绑定的开始,当你调用viewModel.liveData.observe(this, observer)时:

// LiveData.java@MainThreadpublicvoidobserve(@NonNullLifecycleOwnerowner,@NonNullObserver<?superT>observer){// 1. 如果当前页面已经销毁了,直接忽略,不注册if(owner.getLifecycle().getCurrentState()==DESTROYED){return;}// 2. 将 owner (Activity) 和 observer 包装成一个 LifecycleBoundObserverLifecycleBoundObserverwrapper=newLifecycleBoundObserver(owner,observer);// 3. 保存到 map 中ObserverWrapperexisting=mObservers.putIfAbsent(observer,wrapper);// 4. 【关键】将这个 wrapper 注册到 Activity 的生命周期中// 这样 wrapper 就能收到 onStart, onStop, onDestroy 等回调owner.getLifecycle().addObserver(wrapper);}

LifecycleBoundObserver:核心内部类,实现了LifecycleEventObserver,它会监听Activity的生命周期变化

// LiveData.java 的内部类classLifecycleBoundObserverextendsObserverWrapperimplementsLifecycleEventObserver{@NonNullfinalLifecycleOwnermOwner;LifecycleBoundObserver(@NonNullLifecycleOwnerowner,Observer<?superT>observer){super(observer);mOwner=owner;}@OverridepublicvoidonStateChanged(@NonNullLifecycleOwnersource,@NonNullLifecycle.Eventevent){// 【核心代码在这里!】// 每次生命周期变化都会回调这里// 1. 自动断开引用机制// 如果当前状态是 DESTROYED (Activity 正在销毁)if(mOwner.getLifecycle().getCurrentState()==DESTROYED){// 调用 removeObserver,把自己从 LiveData 的列表中移`在这里插入代码片`除removeObserver(mObserver);return;}// 2. 只有在活跃状态 (STARTED/RESUMED) 才发送数据更新activeStateChanged(shouldBeActive());}}

3.removeObserver:彻底断开

// LiveData.javapublicvoidremoveObserver(@NonNullfinalObserver<?superT>observer){ObserverWrapperremoved=mObservers.remove(observer);if(removed==null){return;}// 取消监听生命周期,彻底解绑removed.detachObserver();removed.activeStateChanged(false);}

总结:LiveData的高明之处

LiveData并不是简单地“持有引用然后置空”,它引入了Inversion of Control (控制反转)ViewModel不认识ActivityViewModel里的LiveData只是一个数据容器,它不知道谁在观察它。Activity自己管理自己:Activity通过observe告诉LiveData:“我有生命周期,我死的时候(DESTROYED),请不要再理我,把我的引用扔掉。”
自动清理:
Activity A (Old) 销毁-> 触发LifecycleBoundObserver.onStateChanged-> 检测到DESTROYED->removeObserver-> 引用断开,Activity A被回收。
Activity A (New)重建 -> 调用observe-> 注册新的Observer->ViewModel连接到新的Activity

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/12 21:12:06

智能机票监控终极攻略:FlightSpy如何成为你的旅行省钱秘密武器

还在为机票价格波动而烦恼吗&#xff1f;FlightSpy是一款开源的智能机票监控工具&#xff0c;能够24小时自动追踪目标航线价格变化&#xff0c;在最佳时机为你推送降价通知。这款工具就像你的私人旅行顾问&#xff0c;通过先进的数据分析技术&#xff0c;让你用最少的时间锁定最…

作者头像 李华
网站建设 2026/4/11 22:27:53

Navicat Premium for Mac 完整重置教程:无限试用期解决方案

Navicat Premium for Mac 完整重置教程&#xff1a;无限试用期解决方案 【免费下载链接】navicat_reset_mac navicat16 mac版无限重置试用期脚本 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 还在为Navicat Premium试用期到期而无法继续使用专业功能…

作者头像 李华
网站建设 2026/4/14 10:47:34

Markn轻量级Markdown查看器:5分钟掌握高效文档预览技巧

Markn轻量级Markdown查看器&#xff1a;5分钟掌握高效文档预览技巧 【免费下载链接】markn Lightweight markdown viewer. 项目地址: https://gitcode.com/gh_mirrors/ma/markn 还在为复杂的Markdown工具而烦恼吗&#xff1f;Markn轻量级Markdown查看器正是你需要的解决…

作者头像 李华
网站建设 2026/4/15 3:25:26

AutoCAD字体管理免费插件终极指南:告别字体缺失烦恼

AutoCAD字体管理免费插件终极指南&#xff1a;告别字体缺失烦恼 【免费下载链接】FontCenter AutoCAD自动管理字体插件 项目地址: https://gitcode.com/gh_mirrors/fo/FontCenter 还在为打开DWG文件时弹出的"字体未找到"警告而头疼吗&#xff1f;FontCenter这…

作者头像 李华
网站建设 2026/4/14 10:09:27

Typora插件实现自动展开大纲目录:提升写作效率的必备神器

Typora插件实现自动展开大纲目录&#xff1a;提升写作效率的必备神器 【免费下载链接】typora_plugin Typora plugin. feature enhancement tool | Typora 插件&#xff0c;功能增强工具 项目地址: https://gitcode.com/gh_mirrors/ty/typora_plugin 在Markdown写作领域…

作者头像 李华
网站建设 2026/4/7 22:14:55

PL2303终极兼容方案:Windows系统老芯片驱动快速复活指南

PL2303终极兼容方案&#xff1a;Windows系统老芯片驱动快速复活指南 【免费下载链接】pl2303-win10 Windows 10 driver for end-of-life PL-2303 chipsets. 项目地址: https://gitcode.com/gh_mirrors/pl/pl2303-win10 你手头那些因为驱动问题而被闲置的PL2303设备&…

作者头像 李华