【发布时间】:2020-04-17 14:20:22
【问题描述】:
我对内存泄漏以及可能导致它们的原因有基本的了解。这就是为什么我不明白我的代码是否有问题或者是误报。由于项目不小,我不知道我应该分享代码的哪一部分。但是请在 cmets 中告诉我,我会添加所需的代码。
我使用导航架构组件并遵循 MVVM 模式。我在项目开发后期添加了 LeakCanary 库,当我在屏幕之间导航时,它立即开始向我发出有关保留实例的警告。
当我将片段添加到后台堆栈时会出现问题。随着每个将片段添加到后台堆栈,保留实例的计数器都会增加。当达到阈值 5 时,LeakCanary 转储堆并提供报告。
但是如果我点击后退按钮并返回到前一个屏幕,则保留实例的计数器会减少,最终,当返回到第一个屏幕时,所有保留实例都会消失。
如果我查看堆分析报告,它说变量 coordinatorLayout 是对 xml 中 CoordinatorLayout 的引用已泄漏。如果我删除变量及其所有用法并再次运行应用程序,我会看到同样的问题,但现在有另一个变量是对 xml 中另一个视图的引用。我试图删除 LeakCanary 报告为泄漏的所有视图及其使用情况。当它说 TextView 泄漏时,它只是用于在 onViewCreated 中设置文本而没有在其他任何地方使用,我开始怀疑我的代码中存在问题。
我分析了片段中的生命周期方法调用,并注意到当我导航到前一个片段的新屏幕时,所有方法直到并包括 onDestroyView 都被调用,而不是 onDestroy。当我单击返回时,onDestroy 被调用以获取位于返回堆栈顶部的片段并且保留实例计数器减少。
我怀疑 Navigation 组件在返回堆栈时保留片段的实例,而 LeakCanary 将其视为泄漏。
【问题讨论】:
标签: android kotlin memory-leaks android-architecture-navigation leakcanary