【发布时间】:2025-12-20 02:20:22
【问题描述】:
我有一个ListView,在它的adapter 的getView 方法中,我返回一个RelativeLayout,里面有MyButton。
MyButton 有一个textView,里面有可点击的字词 (ClickableSpan)。
为了完成这项工作,我从以下行开始:
textView.setMovementMethod(LinkMovementMethod.getInstance());
一切正常,但 MAT 显示 MyButton 泄漏是因为 textView。当我注释掉上面的行时,没有任何泄漏。
我应该将movementMethod 设置为null 吗?但即使是这样,我也无法知道将其设置为 null 的按钮的破坏时刻,因为它位于许多其他视图中。
我做错了什么?如何防止这种泄漏?
更新
通过在onDetachedFromWindow 中将文本设置为空字符串解决了泄漏问题,但我仍在尝试查找与此行为相关的文档。为什么要将textview 设置为""?
【问题讨论】:
-
试试 View.onDetachedFromWindow()
-
@pskink 谢谢,将
movementMethod设置为null不起作用,但将文本设置为""确实有效。 (在 onDetachedFromWindow 中)。如果您也知道此泄漏的原因,请将其作为答案发布,以便我将其标记为已接受的答案。我仍然很好奇为什么会发生这种泄漏。没有与此行为相关的文档。 -
我一直在使用LeakCanary 来追踪内存泄漏,最终发现
TextView.setMovementMethod()是罪魁祸首。对我来说不幸的是,将移动方法设置为 null 并将onDetachedFromWindow()中的文本设置为 "" 并没有解决问题。 LeakCanary 表明它与ViewTreeObserver没有清除 preDraw 侦听器有关。鉴于TextView实现了OnPreDrawListener,我想知道这是否在做一些时髦的事情?
标签: android listview memory-leaks textview linkmovementmethod