2

我在我的 Activity 的 onCreate() 方法之一中为 UI 线程实例化我的处理程序。(为避免内存泄漏风险,Handler 不是内部类,而是普通类。)

由于一个 Handler 对应一个 Thread,但一个 Thread 可以有多个 handler(据我所知),每次调用 onCreate() 都会实例化一个新的 Handler 实例。因此,如果我的活动再次重新创建(在 onDestroy 之后,但同时没有任何进程终止),onCreate() 将添加另一个处理程序,而旧的处理程序不会被删除。(在 Android 源代码中,Handler 只请求线程的 Looper 并获取对其消息队列的引用。)

最佳解决方案是什么?我应该将一个 Handler 实例化为一个静态变量,然后在 onCreate() 中,我可以检查它是否为空。如果它是非空的,那么就不需要实例化一个新的,对吧?

(不用说,在 onDestroy() 中,我将 Handler 实例中的 Activity 引用设置为 NULL,因此 Handler 不会泄漏 Activity 或任何相关内容——我的处理程序的处理方法会检查它是否为 null,并在需要时丢弃消息.但我的问题是,由于我猜前面段落中详述的原因,仍然为线程保留了Handler,所以onCreate调用越多,附加到UI线程的Handler实例就越多。我的静态解决方案是否正确?如果这不是关键,那么Android如何检测到与当前线程关联的Handler应该是GC-d?)

4

1 回答 1

5

Handler 不被 Thread、Looper 或其他任何东西引用。处理程序只是您将内容放入 Looper 的消息队列中的一种便捷方式。

如果您在 onCreate() 中实例化一个处理程序并将其分配给您的活动中的成员(实例)变量,那么当您的活动被垃圾收集时,处理程序也将被垃圾收集,因为没有任何东西引用它。

因此在 onCreate() 中创建 Handler 对象不会导致任何内存泄漏。

于 2012-05-15T13:22:15.060 回答