当前位置: 首页 > 知识库问答 >
问题:

导航拱门组件会造成误报内存泄漏吗?

壤驷骁
2023-03-14

我对内存泄漏以及导致内存泄漏的原因有基本的了解。这就是为什么我不明白我的代码中是否有问题,或者是误报。我不知道我应该分享代码的哪一部分,因为这个项目不小。但是请在评论中告诉我,我会添加所需的代码。

我使用导航架构组件并遵循MVVM模式。我在项目开发的后期添加了LeakCanary库,当我在屏幕之间导航时,它立即开始向我发出关于保留实例的警告。

当我将片段添加到后堆栈时,就会出现问题。随着每个片段添加到后堆栈,保留实例的计数器会增加。当达到阈值5时,LeakCanary会转储堆并提供报告。

但若我点击后退按钮并返回到之前的屏幕,那个么保留实例的计数器就会减少,最终,当返回到第一个屏幕时,所有保留实例都会消失。

如果我看堆分析报告,就会发现变量coordinatorLayout已经泄漏,它是xml中对coordinatorLayout的引用。如果我删除变量及其所有用法并再次运行应用程序,我会看到同样的问题,但现在有另一个变量引用了xml中的另一个视图。我试图删除LeakCanary报告为泄漏的所有视图及其用法。当它说一个只用于在创建的视图中设置文本的文本视图正在泄漏时,我开始怀疑我的代码中是否有问题。

我分析了片段中的生命周期方法调用,并注意到当我导航到新屏幕以获取先前片段时,所有方法都被调用,但不调用onDestroy。当我单击返回时,调用位于返回堆栈顶部的片段,并保留实例计数器减少。

我怀疑导航组件在后台堆栈中保留了片段的实例,并且LeakCanary将其视为泄漏。


共有1个答案

郎琪
2023-03-14
匿名用户

这就是后堆栈上的片段的工作方式(导航只使用现有的片段API):片段的视图被破坏,但片段本身没有被破坏-它们保持在创建的状态,直到您点击后退按钮并返回片段(之后将再次调用创建视图(),您将返回到恢复的状态)。

根据碎片:过去、现在和未来的讨论,碎片未来的变化之一是选择加入选项,以销毁后堆栈上的碎片,而不是有两个单独的生命周期。目前尚不可用。

您必须在onDestRoyView中删除对视图的引用,因为这表示该视图已不再被片段系统使用,如果不是您继续引用视图,则可以安全地进行垃圾收集。

 类似资料:
  • 我有一些和等,但是我没有设置。你觉得会是那样吗? 你有什么想法或建议吗? PS:该应用程序在Ubuntu机器上运行 多谢.

  • 问题内容: 我正在运行django应用程序,其中包括matplotlib,并允许用户指定图形的轴。这可能会导致 “溢出错误:超出了Agg复杂度” 发生这种情况时,最多会占用100MB的RAM。通常,我会使用,和释放该内存,但是与该错误关联的内存似乎与该绘图对象无关。 有谁知道我该如何释放记忆? 谢谢。 这是一些给我Agg复杂度错误的代码。 问题答案: 我假设您可以至少运行一次您发布的代码。该问题仅

  • 我想首先说,这是我第一次必须处理性能,因为这是我第一次开发一个android应用程序。 该应用程序是一个源代码编辑器,在这里你可以打开文件,修改它们,并将它们保存回来。该应用程序由4个部分组成: 导航器视图:包含打开文件的ListView和打开文件夹的TreeView。 代码视图容器:它保存包含实际代码的视图。 代码容器:这是一个小视图,包含一个文本视图和一个自定义EditText(由我扩展Edi

  • 我正在玩rxjava,发现如果在活动被销毁之前没有完成订阅,则存在内存泄漏的风险,因为“可观察对象保留对上下文的引用”。如果订阅没有取消订阅,则此类情况的演示之一如下所示。已销毁(来源:https://github.com/dlew/android-subscription-leaks/blob/master/app/src/main/java/net/danlew/rxsubscriptions

  • 本文向大家介绍造成内存泄漏的操作有哪些?相关面试题,主要包含被问及造成内存泄漏的操作有哪些?时的应答技巧和注意事项,需要的朋友参考一下 以前使用"引用计数"的时候, 还挺多的, 现在都使用"标记清除"好很多了 最起码循环引用之类的, 不会再内存泄漏了 我觉得比较可能的是, 创建了时间循环, setInterval, 但是没有没有释放掉, 这个比较容易造成内存泄漏

  • 问题内容: 我正在编写一个测试程序,如下所示: 当用户单击按钮A时,它将打开50个JFrame。 当用户单击按钮B时,它将放置所有通过单击按钮A显示的JFrame。 我发现单击按钮B后内存不会减少。我使用任务管理器(在Windows中为+ + ,并检查“ java”的内存使用情况)确定了这一点。 问题答案: 是的,没有办法,无法解决(不仅在Java PL中), 1)实际上,不要在运行时/运行时创建