news 2026/8/21 19:52:56

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/8/19 16:27:02

益达规则仓库:站点资源解析与高效配置完全指南

作为技术顾问&#xff0c;我经常遇到这样的问题&#xff1a;"为什么我的视频资源总是解析失败&#xff1f;""如何快速配置多个站点的访问规则&#xff1f;"今天&#xff0c;我将通过益达规则仓库这一强大工具&#xff0c;为你提供一站式的解决方案。 【免费…

作者头像 李华
网站建设 2026/8/19 16:33:41

使用PyTorch-CUDA-v2.9镜像训练BERT模型的完整步骤

使用PyTorch-CUDA-v2.9镜像训练BERT模型的完整实践 在如今动辄上百亿参数的语言模型时代&#xff0c;哪怕只是微调一个BERT-base模型&#xff0c;也常常让人在环境配置、GPU兼容性、显存不足等问题上耗费大量时间。你有没有经历过这样的场景&#xff1a;代码写好了&#xff0c;…

作者头像 李华
网站建设 2026/8/19 23:29:22

如何快速配置Typora插件实现自动展开大纲目录

如何快速配置Typora插件实现自动展开大纲目录 【免费下载链接】typora_plugin Typora plugin. feature enhancement tool | Typora 插件&#xff0c;功能增强工具 项目地址: https://gitcode.com/gh_mirrors/ty/typora_plugin 你是否厌倦了每次打开Typora文档都要手动点…

作者头像 李华
网站建设 2026/8/19 16:30:00

快速理解Multisim元件库下载对仿真效率的影响

为什么你的Multisim仿真总是卡在“模型未找到”&#xff1f;元件库下载的坑你踩过几个&#xff1f; 你有没有遇到过这样的场景&#xff1a; 兴冲冲打开Multisim&#xff0c;准备复现一篇论文里的精密放大电路&#xff0c;结果刚拖出一个 OPA189 &#xff0c;软件就弹出红字…

作者头像 李华
网站建设 2026/8/19 16:29:56

2024终极指南:3分钟搞定ADB驱动安装,告别繁琐手动配置!

2024终极指南&#xff1a;3分钟搞定ADB驱动安装&#xff0c;告别繁琐手动配置&#xff01; 【免费下载链接】Latest-adb-fastboot-installer-for-windows A Simple Android Driver installer tool for windows (Always installs the latest version) 项目地址: https://gitco…

作者头像 李华
网站建设 2026/8/19 16:29:11

PyTorch-CUDA-v2.9镜像支持Music Generation音乐生成吗?Jukebox简化版

PyTorch-CUDA-v2.9镜像支持Music Generation音乐生成吗&#xff1f;Jukebox简化版 在AI创作浪潮席卷内容产业的今天&#xff0c;一个实际而迫切的问题摆在开发者面前&#xff1a;我们能否用现成的深度学习环境&#xff0c;快速跑通一段由神经网络“作曲”的音乐&#xff1f; 尤…

作者头像 李华