gpt4 book ai didi

Android TextView 与 setMovementMethod 泄漏

转载 作者:太空宇宙 更新时间:2023-11-03 11:49:08 25 4
gpt4 key购买 nike

我有一个 ListView 并且在它的 adaptergetView 方法中,我返回一个 RelativeLayoutMyButton 在里面。

MyButton 有一个 textView,我在里面有可点击的单词 (ClickableSpan)。

为了完成这项工作,我从以下行开始:textView.setMovementMethod(LinkMovementMethod.getInstance());

一切正常,但 MAT 显示 MyButton 由于 textView 而泄漏。当我注释掉上面的行时,没有任何泄漏。

我应该将 movementMethod 设置为 null 吗?但即使是这样,我也无法知道将其设置为 null 的按钮的销毁时刻,因为它在许多其他 View 中。

我做错了什么?如何防止这种泄漏?

enter image description here

更新

通过在 onDetachedFromWindow 中将文本设置为空字符串解决了泄漏问题,但我仍在尝试查找与此行为相关的文档。为什么要将 textview 设置为 ""

最佳答案

Fragment 中创建超链接时,我遇到了 TextViewClickableSpanLinkMovementMethod 的另一次内存泄漏。第一次点击超链接后设备旋转,由于NPE无法再次点击。

为了弄清楚发生了什么,我进行了调查,结果如下。

TextViewonSaveInstanceState() 期间保存字段 mText 的副本,其中包含 ClickableSpan静态内部类 SavedState 的实例。它仅在特定条件下发生。在我的例子中,它是可点击部分的 Selection,在第一次点击 span 后由 LinkMovementMethod 设置。

接下来,如果有保存状态,TextViewmText 字段执行恢复,包括所有的span,来自TextView.SavedState.textonRestoreInstanceState() 期间。

这是一个有趣的部分。 onRestoreInstanceState() 何时被调用?它在 onStart() 之后调用。我在 onCreateView() 中设置了一个新的 ClickableSpan 对象,但是在 onStart() 之后旧对象替换了新对象,这导致了大问题。

因此,解决方案非常简单但未记录在案——在 onStart() 期间执行 ClickableSpan 的设置。

您可以在我的博客上阅读完整的调查 TextView, ClickableSpan and memory leaksample project .

关于Android TextView 与 setMovementMethod 泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28539216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com