我有一个线程用于定期更新Activity中的数据。我创建了线程并启动了一个looper来使用postDelay()
的处理程序。在我的活动的onDestroy()中,我在我的处理程序上调用removeCallbacks()。
我应该拨打handler.getLooper().quit()
吗?或者不用担心它,让操作系统处理它?或者它会永远运行,消耗CPU周期?
答案 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()在消息队列中所有本应传递的剩余消息都得到处理后立即终止