事件监听器中的内存泄漏

时间:2011-02-15 10:38:08

标签: android memory-leaks static inner-classes event-listener

我已经阅读了文章http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html。在本文中,建议使用带有WeakReference的静态内部类。许多内部类用于事件侦听器。那些内部类也会导致内存泄漏吗?那些内在阶级应该是静态的吗?

1 个答案:

答案 0 :(得分:39)

  

那些内部类也会导致内存泄漏吗?

可能。这取决于那些听众注册的内容。

例如,OnClickListener编写良好的Button不应导致内存泄漏,因为即使OnClickListener可能是内部类并且具有隐式引用Activity,整个对象集都与活动紧密相连。因此,当活动被销毁时,活动ButtonOnClickListener都可以作为一个整体进行垃圾收集。

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

  

那些内心阶级应该是Staic吗?

可能。在大多数情况下,正确答案是“如果您正在注册除UI之外的其他侦听器,请务必在适当的位置注销它”。在这种情况下,不会有泄漏。

  

任何人都可以给我任何示例代码,事件监听器可以如何防漏使用。

不是抽象的,没有。