Android: Выход из Looper?

У меня есть поток, который я использую для периодического обновления данных в моей Activity. Я создаю поток и запускаю петлитель для использования обработчика с postDelay(). В onDestroy() для моей активности я вызываю removeCallbacks() в моем обработчике.

Должен ли я позвонить handler.getLooper().quit()? Или не беспокойтесь об этом и позвольте ОС справиться с этим? Или он просто запускается вечно, потребляя циклы процессора?

Ответы

Ответ 1

В соответствии с Android-документацией вы должны вызвать 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);
}

Ответ 2

Теперь я не верю в правильный ответ, но, судя по нескольким документам и учебным пособиям, которые я видел в Интернете, никто из них не вызывает handler.getLooper(). quit(). Поэтому я бы предположил, что нет необходимости делать это явно.

Но действительно ли нет недостатка, если вы просто добавите этот однострочный вкладыш в свой метод onDestroy()?