アクティビティのデータを定期的に更新するために使用するスレッドがあります。スレッドを作成し、 でハンドラを使用するためのルーパーを開始しpostDelay()
ます。アクティビティの onDestroy() では、ハンドラで removeCallbacks() を呼び出します。
私は電話するべきhandler.getLooper().quit()
ですか?それとも心配せずにOSに任せますか?それとも、CPUサイクルを消費して永遠に実行されますか?
アクティビティのデータを定期的に更新するために使用するスレッドがあります。スレッドを作成し、 でハンドラを使用するためのルーパーを開始しpostDelay()
ます。アクティビティの onDestroy() では、ハンドラで removeCallbacks() を呼び出します。
私は電話するべきhandler.getLooper().quit()
ですか?それとも心配せずにOSに任せますか?それとも、CPUサイクルを消費して永遠に実行されますか?
Androidのドキュメントによると、quit()を呼び出す必要があります。
whileを呼び出すとLooper.loop()
、ループが開始されます。呼び出す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);
}
正しい答えはわかりませんが、インターネットで見たいくつかのドキュメントやチュートリアルから判断すると、どれも handler.getLooper().quit() を呼び出していません。したがって、これを明示的に行う必要はないと思います。
しかし、このワンライナーを onDestroy() メソッドに追加するだけで、本当に欠点はありませんか?