【问题标题】:Is it OK to use non-static Handler in non-Activity class?在非Activity类中使用非静态Handler可以吗?
【发布时间】:2014-08-09 09:12:43
【问题描述】:

我知道为什么使用静态处理程序是个好主意(在处理处理程序时避免内存泄漏)。但是,我读过的大多数内容似乎都暗示它是为了防止应用程序/上下文泄漏。所有示例代码都有一个 Activity 或 Service 作为外部类。例如,这篇经常链接的帖子谈到了泄露的上下文和视图 (http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html)。它以引用“底线是什么?如果内部类的实例超出活动的生命周期,请避免在活动中使用非静态内部类。相反,更喜欢静态内部类并保持对内部活动的弱引用。”

这是否意味着如果拥有的类没有与 Android 生命周期相关的任何字段并且不是 Activity/Service/etc,则可以使用非静态处理程序?我会这么认为,但 Lint 警告并不关心外部类是什么类。我知道我仍然可以泄漏我的外部类及其字段,但在我的场景中至少它几乎什么都没有。

【问题讨论】:

    标签: android


    【解决方案1】:

    我不会说没关系,但也许没那么糟糕。上下文是一个特别重的泄漏。泄漏封闭类可能没什么大不了的。再说一次,它可能会。

    基本上,当消息延迟发布时,会发生处理程序泄漏。 Message 包含对 Handler 的引用,因此在处理 Message 之前,Handler 保持可访问性。并且注意,即使没有显式延迟,Looper 的队列中可能还有其他任务必须在处理 Message 之前完成,因此可能会有轻微的延迟。如果 Context(或您的 Handler 引用的任何其他内容)在此期间变得无效,则可能导致错误。

    【讨论】:

    • 我将如何泄露上下文?在我的例子中,外部类实际上只有两个字段(两个字符串数组)并且不扩展任何东西。当然,处理程序确实以某种方式引用了上下文,但除非我弄错了,否则我无法避免处理程序自身泄漏,可以吗?处理程序是否有对其外部类的引用对其是否泄漏没有影响;它只会影响泄漏时发生的情况。
    • 处理程序引用上下文的通常方式是作为 Activity 的非静态内部类,因此具有对 Activity 的隐式引用。听起来你明白这一点。我并不是要暗示你的 Handler 一定会泄漏一个 Context。
    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2021-05-02
    • 2017-09-01
    • 1970-01-01
    • 2016-01-27
    • 2017-01-03
    相关资源
    最近更新 更多