事件监听器中的内存泄漏问题

30
1个回答

46
那些内部类也可能会导致内存泄漏,这取决于这些监听器注册的对象。例如,一个良好编写的Button OnClickListener不会导致内存泄漏,因为即使OnClickListener是内部类并隐式引用Activity,所有这些对象都只与Activity相关联。因此,当Activity被销毁时,Activity、Button和OnClickListener可以作为整体被垃圾回收。但是,如果使用LocationManager系统服务注册了LocationListener,则该listener将由进程持有。因此,即使Activity被销毁,listener仍将保持注册状态。如果该listener是内部类,则它将继续隐式地引用Activity,从而导致内存泄漏。
在大多数情况下,正确的答案是:如果您正在注册除UI之外的其他监听器,请确保在适当的时候取消注册。在这种情况下,就不会出现内存泄漏。没有抽象的示例代码可以展示如何无泄漏地使用事件侦听器。

这里有一个简单的监听器会导致内存泄漏:https://dev59.com/oWw05IYBdhLWcg3wsz3N - user4o01
我怎样才能知道Listener是绑定在Activity上还是被进程持有? - JaskeyLam
如果我的监听器持有活动上下文的引用。我将这个监听器设置在我的适配器中。但一些情况下,LeakCanary会提示出现了内存泄漏。这是什么原因呢?我有点困惑... - EduardoMaia
@EduardoMaia:我建议您提出一个单独的Stack Overflow问题,在那里您可以提供一个[mcve]。 - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接