14

アクティビティのデータを定期的に更新するために使用するスレッドがあります。スレッドを作成し、 でハンドラを使用するためのルーパーを開始しpostDelay()ます。アクティビティの onDestroy() では、ハンドラで removeCallbacks() を呼び出します。

私は電話するべきhandler.getLooper().quit()ですか?それとも心配せずにOSに任せますか?それとも、CPUサイクルを消費して永遠に実行されますか?

4

3 に答える 3

18

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);
}
于 2010-09-20T16:56:45.647 に答える
0

正しい答えはわかりませんが、インターネットで見たいくつかのドキュメントやチュートリアルから判断すると、どれも handler.getLooper().quit() を呼び出していません。したがって、これを明示的に行う必要はないと思います。

しかし、このワンライナーを onDestroy() メソッドに追加するだけで、本当に欠点はありませんか?

于 2010-05-08T13:34:05.410 に答える