Android:退出Looper?

时间:2010-05-08 06:55:19

标签: android multithreading message-queue handler

我有一个线程用于定期更新Activity中的数据。我创建了线程并启动了一个looper来使用postDelay()的处理程序。在我的活动的onDestroy()中,我在我的处理程序上调用removeCallbacks()。

我应该拨打handler.getLooper().quit()吗?或者不用担心它,让操作系统处理它?或者它会永远运行,消耗CPU周期?

3 个答案:

答案 0 :(得分:18)

根据Android Documentation你应该打电话给quit()。

当您致电Looper.loop()时,会启动while循环。调用Looper.quit()会导致循环终止。循环执行时,垃圾收集器无法收集您的对象。

以下是Looper.java的相关部分:

public static final void loop() {
    Looper me = myLooper();
    MessageQueue queue = me.mQueue;
    while (true) {
        Message msg = queue.next(); // might block
        //if (!me.mRun) {
        //    break;
        //}
        if (msg != null) {
            if (msg.target == null) {
                // No target is a magic identifier for the quit message.
                return;
            }
            if (me.mLogging!= null) me.mLogging.println(
                    ">>>>> Dispatching to " + msg.target + " "
                    + msg.callback + ": " + msg.what
                    );
            msg.target.dispatchMessage(msg);
            if (me.mLogging!= null) me.mLogging.println(
                    "<<<<< Finished to    " + msg.target + " "
                    + msg.callback);
            msg.recycle();
        }
    }
}

public void quit() {
    Message msg = Message.obtain();
    // NOTE: By enqueueing directly into the message queue, the
    // message is left with a null target.  This is how we know it is
    // a quit message.
    mQueue.enqueueMessage(msg, 0);
}

答案 1 :(得分:0)

我现在没有正确的答案,但从我在互联网上看到的几个文档和教程判断,它们都没有调用handler.getLooper()。quit()。所以我猜想没有必要明确地这样做。

但是如果你只是在你的onDestroy()方法中添加这个单行,那么确实没有任何缺点吗?

答案 2 :(得分:0)

除乔纳森(Jonathan)的上述answer外,请在quit()quitSafely()之间明智地选择quit()终止而不处理消息中的任何其他消息队列,其中quitSafely()在消息队列中所有本应传递的剩余消息都得到处理后立即终止