事件侦听器中的内存泄漏
Posted
技术标签:
【中文标题】事件侦听器中的内存泄漏【英文标题】:Memory leakage in event listener 【发布时间】:2011-06-27 12:26:52 【问题描述】:我已经阅读了http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html 的文章。在本文中,建议使用带有 WeakReference 的静态内部类。许多内部类用于事件侦听器。那些内部类也会导致内存泄漏吗?那些内部类应该是静态的吗?
【问题讨论】:
【参考方案1】:那些内部类也会导致内存泄漏吗?
可能。这取决于这些侦听器的注册对象。
例如,为Button
编写良好的OnClickListener
不应导致内存泄漏,因为即使OnClickListener
可能是内部类并且隐式引用Activity
,整套对象都与活动相关联。因此,当 Activity 被销毁时,Activity、Button
和 OnClickListener
都可以作为一个整体进行垃圾回收。
但是,向LocationManager
系统服务注册的LocationListener
由进程持有。因此,即使活动被销毁,监听器仍将保持注册状态。如果该监听器是一个内部类,它将继续持有对活动的隐式引用,并且您将发生内存泄漏。
那些内部类应该是 Staic 的吗?
可能。在大多数情况下,正确的答案是“如果您在 UI 之外注册侦听器,请务必在适当的时候取消注册”。在这种情况下,不会有泄漏。
谁能给我任何示例代码,事件侦听器如何防漏使用。
不是抽象的,不。
【讨论】:
这里是一个导致内存泄漏的简单监听器***.com/questions/7083441/… 如何知道 Listener 是绑定到活动还是被进程持有? 如果我的听众持有对活动上下文的引用。我在我的适配器中设置了这个监听器。不知何故,LeakCanary 指责内存泄漏。会是什么呢?我有点困惑... @EduardoMaia:我建议您提出一个单独的 Stack Overflow 问题,并提供 minimal reproducible example。以上是关于事件侦听器中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
检测到套接字 io 可能的 EventEmitter 内存泄漏