【问题标题】:Memory leakage in event listener事件侦听器中的内存泄漏
【发布时间】:2011-06-27 12:26:52
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    可能。这取决于这些侦听器的注册对象。

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

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

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

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

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

    不是抽象的,不。

    【讨论】:

    • 这里是一个导致内存泄漏的简单监听器stackoverflow.com/questions/7083441/…
    • 如何知道 Listener 是绑定到活动还是被进程持有?
    • 如果我的听众持有对活动上下文的引用。我在我的适配器中设置了这个监听器。不知何故,LeakCanary 指责内存泄漏。会是什么呢?我有点困惑...
    • @EduardoMaia:我建议您提出一个单独的 Stack Overflow 问题,并提供 minimal reproducible example
    猜你喜欢
    • 2014-08-13
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 2013-01-11
    相关资源
    最近更新 更多