我对内存泄漏以及可能导致它们的原因有基本的了解。这就是为什么我不明白我的代码中是否有问题还是误报的原因。我不知道我应该共享代码的哪一部分,因为该项目并不小。但是,请在评论中让我知道,然后我将添加所需的代码。
我使用导航拱形组件并遵循MVVM模式。我在项目开发的后期添加了LeakCanary库,当我在屏幕之间导航时,它立即开始向我发出有关保留实例的警告。
当我将片段添加到后堆栈时,会发生问题。随着向后堆栈中添加的每个片段,保留实例的计数器增加。当达到阈值5时,LeakCanary将转储堆并提供报告。
但是,如果我单击“后退”按钮并返回到先前的屏幕,则保留实例的计数器减少,最终,当返回到第一个屏幕时,所有保留的实例都会消失。
如果我查看堆分析报告,它表示变量coordinatorLayout是CoordinatorLayout
xml中的引用。如果删除该变量及其所有用法,然后再次运行该应用程序,我会看到相同的问题,但是现在有了另一个变量,该变量引用了xml中的另一个视图。我试图删除LeakCanary报告为泄漏的所有视图及其用法。当它说a TextView
只是用于设置文本onViewCreated
而不在其他地方使用时,正在泄漏,我开始怀疑我的代码是否有问题。
我分析了片段中的生命周期方法调用,并注意到当我导航到先前片段的新屏幕时,直到(包括)所有方法onDestroyView
都被调用,但没有被调用onDestroy
。当我单击返回时,onDestroy
将调用位于后堆栈顶部和保留实例顶部的片段,计数器会减少。
我怀疑导航组件在返回堆栈中时会保留片段的实例,而LeakCanary却将其视为泄漏。
onDestroyView
。