事件侦听器中的内存泄漏

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、ButtonOnClickListener 都可以作为一个整体进行垃圾回收。

但是,向LocationManager 系统服务注册的LocationListener 由进程持有。因此,即使活动被销毁,监听器仍将保持注册状态。如果该监听器是一个内部类,它将继续持有对活动的隐式引用,并且您将发生内存泄漏。

那些内部类应该是 Staic 的吗?

可能。在大多数情况下,正确的答案是“如果您在 UI 之外注册侦听器,请务必在适当的时候取消注册”。在这种情况下,不会有泄漏。

谁能给我任何示例代码,事件侦听器如何防漏使用。

不是抽象的,不。

【讨论】:

这里是一个导致内存泄漏的简单监听器***.com/questions/7083441/… 如何知道 Listener 是绑定到活动还是被进程持有? 如果我的听众持有对活动上下文的引用。我在我的适配器中设置了这个监听器。不知何故,LeakCanary 指责内存泄漏。会是什么呢?我有点困惑... @EduardoMaia:我建议您提出一个单独的 Stack Overflow 问题,并提供 minimal reproducible example。

以上是关于事件侦听器中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

检测到套接字 io 可能的 EventEmitter 内存泄漏

Websocket 内存泄漏 node.js。事件发射器?

凌空请求的匿名侦听器导致内存泄漏

如何在 OnDestroy 中删除此 firebase 侦听器以减少内存泄漏?

清理 JavaFX 属性侦听器和绑定(内存泄漏)

添加触摸事件时iOS webview中的内存泄漏