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

2024-02-15

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

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

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

但是,如果我单击后退按钮并返回到先前的屏幕,则保留实例的计数器就会减少,最终,当返回到第一个屏幕时,所有保留的实例都会消失。

如果我查看堆分析报告,它会说变量 coordinatorLayout 是对CoordinatorLayoutxml中已经泄露。如果我删除该变量及其所有用法并再次运行应用程序,我会看到同样的问题,但现在另一个变量是对 xml 中另一个视图的引用。我尝试删除 LeakCanary 报告泄漏的所有视图及其用法。当它说一个TextView,它只是用来设置文本onViewCreated并且没有在其他地方使用,正在泄漏我开始怀疑我的代码中有问题。

我分析了片段中的生命周期方法调用,并注意到当我导航到上一个片段的新屏幕时,所有方法直到并包括onDestroyView被呼叫但没有onDestroy。当我点击返回时onDestroy调用位于返回堆栈顶部的片段,并且保留实例计数器减少。

我怀疑导航组件在返回堆栈中时保留了片段的实例,而 LeakCanary 将其视为泄漏。


这就是后台堆栈上的 Fragment 的工作方式(导航仅使用现有的 Fragment API):Fragment 的视图被销毁,但 Fragment 本身并没有被销毁 - 它们被保存在CREATED状态,直到您点击后退按钮并返回到 Fragment(之后onCreateView()将再次被呼叫,您将返回到RESUMED).

根据片段:过去、现在和未来 https://youtu.be/RS1IACnZLy4?t=957,未来对片段的更改之一是选择销毁返回堆栈上的片段,而不是具有两个单独的生命周期。目前尚不可用。

您必须取消对以下视图的引用onDestroyView因为这表明该视图不再被 Fragment 系统使用,并且如果您不继续引用该视图,则可以安全地对其进行垃圾收集。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

导航拱门组件是否会造成误报内存泄漏? 的相关文章

  • gradle更新后无法找到方法(无法编译项目)

    我尝试将项目中的 gradle 版本更新为 4 1 milestone 1 以下这些说明 https developer android com studio build gradle plugin 3 0 0 migration html
  • 如何在android中显示保存在sdcard文件夹中的图像[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 当我正在显
  • Android WebView里面的ScrollView只滚动scrollview

    在我的应用程序中 我有一个 ScrollView 其中包含一些线性视图 一些文本视图和一个 Webview 然后是其他线性布局等 问题是 WebView 不滚动 Scroll 仅侦听 ScrollView 有什么建议么
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • Android 深度链接至 Instagram 应用

    Instagram 已经发布了 iOS 深层链接的 url 方案 但尚未为 Android 创建文档 有没有办法深入链接到 Android 上的 Instagram 应用程序 以转到 Instagram 应用程序中的特定位置 例如 Inst
  • Android Eclipse 上的 Web 服务

    我是 android eclipse java 的新手 事实上这个论坛也是如此 有人遇到过这种情况吗 从用户那里获取输入并通过使用 android eclipse 中的 Web 服务来显示适当的结果 有可用的示例吗 非常感谢 我正在发布教程
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • Mipmap 与可绘制文件夹[重复]

    这个问题在这里已经有答案了 我正在使用 Android Studio 1 1 Preview 1 我注意到 当我创建一个新项目时 我得到以下层次结构 不同 DPI 的 Mipmap 文件夹 不再有不同 DPI 的可绘制文件夹 我应该将所有资
  • 您使用什么物理 Android 设备进行测试?

    有什么好的推荐用于测试目的的物理 Android 设备吗 我正在苹果阵营寻找像 iPod touch 这样的设备 可以帮助 iOS 开发人员测试他们的东西 我知道有 Nexus One 但那东西相当昂贵 而且我并不真正关心手机的东西 而是可
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • Android Studio 缓慢的增量构建

    我已经完成了许多步骤来完善我们的构建系统 those https stackoverflow com questions 16775197 building and running app via gradle and android st
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • 在命令行上卸载 Android SDK 的选定部分

    这与 卸载旧的 Android SDK 版本 https stackoverflow com questions 15182377 uninstall old android sdk versions 除非我想在无头 Linux CI 服务
  • 如何检查 Android 中的同步设置

    我正在构建一个 Android 应用程序 我需要检查设备中注册的每个单独帐户的同步设置 我知道我可以通过 ContentResolver 类来做到这一点 但我遇到了一些问题 我已设法获取设备上所有帐户的列表 但我不知道在运行时从哪里获取特定
  • 没有支持 FEATURE_CAMERA_EXTERNAL 的 Android 设备

    根据this doc https source android com devices camera external usb cameras一些 Android 设备允许使用 Camera2 API 访问外部 USB 摄像头 我检查了大约
  • Android:如何从网络异步获取搜索建议?

    我创建了一个可搜索的活动 现在 我想添加从网络服务获取的搜索建议 我想异步获取这些建议 根据添加自定义建议 http developer android com guide topics search adding custom sugge
  • 发布的 Android apk 出现错误“包文件未正确签名”

    我最近将我的应用程序上传到 Android 市场 但是由于错误 下载时它拒绝运行 包文件未正确签名 我首先使用 eclipse 发布了数据包 右键单击导出 创建密钥库然后发布 但它拒绝工作 然后我下载了 keytool 和 jarsigne
  • 有没有任何代码可以在android中设置壁纸而无需裁剪和缩放?

    我正在创建一个画廊应用程序 我的第一个应用程序 这是我的代码 Bitmap bmd BitmapFactory decodeStream is try getApplicationContext setWallpaper bmd catch

随机推荐

  • 在 PHP 中查找多个字符串位置

    我正在编写一个解析给定 URL 的 PHP 页面 我能做的就是仅找到第一个出现的值 但是当我回显它时 我得到另一个值而不是给定的值 这就是我到目前为止所做的 我知道可以使用循环 但我不知道循环体的条件 我怎
  • 在从 PHP 发送的电子邮件中使用 HTML 格式

    如何通过 PHP 脚本发送 HTML 格式 由于某种原因 它总是显示为 b Example b 代替Example 我确信我必须在某个地方包含 HTML 标头 我只是不知道需要做什么 我是一个十足的 PHP 菜鸟 这是我的 PHP 脚本 相
  • Jupyter笔记本导入错误:没有名为tornado.log的模块

    我已经安装了 jupyter 当尝试启动它时 出现以下错误 File Library Frameworks Python framework Versions 2 7 bin jupyter notebook line 7 in
  • 防病毒软件说我的程序可疑

    我在 wpf Visual Studios 中构建了一个程序 当我运行它时 avast 说检测到可疑程序 然后关闭我的程序 我可以采取任何措施来验证它 还是必须进入 avast 并将其设置为不阻止我的程序 您当然可以在大多数主要防病毒软件包
  • 获取 json 数组的下一个和上一个元素

    我的代码需要帮助 我想要一个上一个和一个下一个按钮 这些按钮将调用函数 viewBlogItem direction cat blogid 在该函数中 我将读出 json 文件 并按 类别 进行分类 每个 blogItem 都有一个arti
  • 机器码对齐

    我正在尝试了解机器代码对齐的原理 我有一个汇编器实现 可以在运行时生成机器代码 我在每个分支目标上使用 16 字节对齐 但看起来这不是最佳选择 因为我注意到 如果我删除对齐 有时相同的代码会运行得更快 我认为这与缓存线宽度有关 因此某些命令
  • 使用C#播放MP3文件

    我正在寻找一种无需任何第三方播放 MP3 文件的方法 媒体播放器等 有什么方法可以做到这一点吗 谢谢 我写了一个开源库 名为NAudio http naudio codeplex com可以做到这一点 private IWavePlayer
  • boost::graph 中的 DFS 更改图形内容

    最小的例子 include
  • 是否可以禁用应用程序而不隐藏它们?

    背景 最终用户可以通过操作系统内置的应用程序管理器禁用某些应用程序 该屏幕看起来像这样 在某些设备上它显示 关闭 一旦禁用应用程序 它就不会处于活动状态 并且不会以任何方式运行 直到您再次重新启用它 不过 为了重新启用它 您仍然可以在应用程
  • 即使具有 INTERNET 权限,连接到页面时仍显示“权限被拒绝”

    从 Android 连接到任何页面时 我收到此异常 06 09 12 50 42 725 WARN System err 1080 java net SocketException Permission denied 06 09 12 50
  • python的sphinx中var、cvar和ivar有什么区别?

    我正在阅读 sphinx 文档页面 讽刺的是发现关于 var ivar 和 cvar 之间差异的文档非常缺乏 我想知道是否有人可以解释内联代码中每个不同名称空间之间的区别 Example class foo object var str f
  • 替换/删除与正则表达式 (.NET) 不匹配的字符

    我有一个正则表达式来验证字符串 但现在我想删除所有与我的正则表达式不匹配的字符 E g regExpression w text This is a sample text with some invalid characters Remo
  • 为什么我的 IdentityRoles 和 ApplicationUsers 没有填充到我的数据库中?

    我在 net core 3 1 Web 应用程序中播种用户时遇到问题 正在 SQL Server 上创建相应的表 但当我运行应用程序时没有创建任何行 我不知道为什么数据库没有被填充 有人能发现这个问题吗 DBInitializer 文件将用
  • 如何通过路径访问多维数组元素? [复制]

    这个问题在这里已经有答案了 可能的重复 PHP 使用字符串作为数组索引路径来检索值 https stackoverflow com questions 1677099 php use a string as an array index p
  • 从信号器 js 客户端向集线器功能传递连接令牌是安全的还是黑客的

    我读了这篇文章http www asp net signalr overview security introduction to security connectiontoken http www asp net signalr over
  • VisualVM 校准步骤在 Windows 10 中挂起

    情况 我已在 Windows 10 周年纪念版上安装了 VisualVM 1 3 8 并且没有使用 JDK 8 附带的版本 我想用它来分析 Java Play 应用程序 会发生什么 当启动 CPU 分析时 它首先询问我需要校准 当发生这种情
  • 在数据表列中查找最长的字符串

    我想知道是否可以创建一个 单行 Linq 来检索特定数据表列的最长字符串值 这意味着所有列数据 数字 日期 字符串 都应转换为字符串 然后返回最长的字符串 我发现的只是如何从列表中获取最长的字符串或最大长度值 这是我到目前为止所尝试的 长度
  • 点击列表视图、视图单元格内的其他按钮即可更改按钮的图像

    我有一个listview This list view有 5 行 其中有 2 行buttons namely A B 当我点击button A on a row 我想改变图像A也B在同一行 反之亦然 我可以单独点击并更改同一图像button
  • 包含文件中的 CGO 未定义引用

    在 Go 中包装 OpenJtalk 成功包含文件并引用类型 没有出现问题 但函数会触发undefined reference error jtalk go package main cgo CFLAGS I home vagrant op
  • 导航拱门组件是否会造成误报内存泄漏?

    我对内存泄漏以及导致内存泄漏的原因有基本的了解 这就是为什么我不明白我的代码是否有问题或者是误报 由于项目不小 我不知道应该分享哪部分代码 但请在评论中告诉我 我将添加所需的代码 我使用导航拱门组件并遵循 MVVM 模式 我后来在项目开发中