0

0

如何修复 LeakCanary 检测到的 Fragment 内存泄漏问题

花韻仙語

花韻仙語

发布时间:2025-12-29 18:07:27

|

426人浏览过

|

来源于php中文网

原创

如何修复 LeakCanary 检测到的 Fragment 内存泄漏问题

leakcanary 报告显示 `search` fragment 存在严重内存泄漏,核心原因是未在 `ondestroyview()` 中及时清理视图引用(如 `binding`、`adapter`)及后台任务,导致 `view` 及其持有链长期驻留内存。

该泄漏路径清晰指向 mwonyaa.Fragments.Search:从 FrameLayout(已 detach 但未置空)向上追溯,经 SwipeRefreshLayout → RecyclerView → ConstraintLayout → CardSliderViewPager → 自定义 SlidingTask → TimerTask 队列,最终关联到 RootActivity 的非销毁实例。这表明 Fragment 虽已调用 onDestroyView(),但其 binding 仍强引用着整个 View 层级树,且 SlidingTask(可能用于轮播动画或自动滑动)未被取消,持续持有着 ViewPager 实例 —— 这正是典型的 Fragment 视图生命周期管理不当 引发的泄漏。

✅ 正确做法:在 onDestroyView() 中彻底解绑

Kotlin 中推荐使用 viewBinding + 可空委托属性,并在 onDestroyView() 中主动清空所有强引用:

PPT.AI
PPT.AI

AI PPT制作工具

下载
private var _binding: FragmentSearchBinding? = null
private val binding get() = _binding!!

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    _binding = FragmentSearchBinding.inflate(inflater, container, false)
    return binding.root
}

override fun onDestroyView() {
    // ✅ 1. 清空 RecyclerView Adapter(避免 Adapter 持有 ViewHolder 及 Context)
    binding.mainRecycler.adapter = null

    // ✅ 2. 取消任何与 View 绑定的定时任务(如 CardSliderViewPager 的 SlidingTask)
    binding.viewPager.stopAutoScroll() // 假设提供该方法;否则需暴露并调用 cancel()

    // ✅ 3. 清空 binding 引用(关键!防止 View 树被 retain)
    _binding = null

    // ✅ 4. 取消 ViewModel 关联的协程作用域(如有)
    viewModel.uiScope.cancel()

    super.onDestroyView()
}
⚠️ 注意事项:不要使用 lateinit var binding:它无法在 onDestroyView() 中设为 null,一旦初始化即永久持有 View 引用,极易泄漏;binding.root 不等于 binding:binding 是整个绑定类实例,包含所有子 View 引用,必须整体置空;自定义控件需自查生命周期:CardSliderViewPager 中的 SlidingTask 若继承 TimerTask 并被 Timer 持有,则 Timer 是 GC Root —— 必须在 onDetachedFromWindow() 或 destroy() 中显式 timer.cancel() + timer.purge();ExoPlayer 相关泄漏需额外处理:若 playerView 在此 Fragment 中使用,务必在 onDestroyView() 中调用 playerView.player = null,并在 onDestroy() 中释放 SimpleExoPlayer 实例(遵循 ExoPlayer 官方生命周期建议)。

? 补充排查建议

  • 在 CardSliderViewPager 源码中搜索 Timer / Handler / postDelayed 相关逻辑,确保其在 onDetachedFromWindow() 或 destroy() 中被清除;
  • 使用 @SuppressLint("StaticFieldLeak") 的静态 Handler 或 AsyncTask 已被弃用,应改用 Handler(Looper.getMainLooper()) + WeakReference
  • 启用 LeakCanary 的「严格模式」(AppWatcher.config = AppWatcher.config.copy(watchFragmentViews = true)),可更早捕获 View 级别泄漏。

遵循上述规范后,Search Fragment 的泄漏路径将被完全切断,LeakCanary 报告中 FrameLayout 的 Leaking: YES 状态将消失,App 内存占用趋于稳定,崩溃率显著下降。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

229

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

433

2024.03.01

excel制作动态图表教程
excel制作动态图表教程

本专题整合了excel制作动态图表相关教程,阅读专题下面的文章了解更多详细教程。

24

2025.12.29

freeok看剧入口合集
freeok看剧入口合集

本专题整合了freeok看剧入口网址,阅读下面的文章了解更多网址。

74

2025.12.29

俄罗斯搜索引擎Yandex最新官方入口网址
俄罗斯搜索引擎Yandex最新官方入口网址

Yandex官方入口网址是https://yandex.com;用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

207

2025.12.29

python中def的用法大全
python中def的用法大全

def关键字用于在Python中定义函数。其基本语法包括函数名、参数列表、文档字符串和返回值。使用def可以定义无参数、单参数、多参数、默认参数和可变参数的函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

16

2025.12.29

python改成中文版教程大全
python改成中文版教程大全

Python界面可通过以下方法改为中文版:修改系统语言环境:更改系统语言为“中文(简体)”。使用 IDE 修改:在 PyCharm 等 IDE 中更改语言设置为“中文”。使用 IDLE 修改:在 IDLE 中修改语言为“Chinese”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

18

2025.12.29

C++的Top K问题怎么解决
C++的Top K问题怎么解决

TopK问题可通过优先队列、partial_sort和nth_element解决:优先队列维护大小为K的堆,适合流式数据;partial_sort对前K个元素排序,适用于需有序结果且K较小的场景;nth_element基于快速选择,平均时间复杂度O(n),效率最高但不保证前K内部有序。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

12

2025.12.29

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

136

2025.12.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 39.6万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号