De acuerdo con Android Documentation, debe llamar a quit().
Cuando llame al Looper.loop()
se inicia un ciclo while. Llamar al Looper.quit()
hace que el ciclo termine. El recolector de basura no puede recoger su objeto mientras se ejecuta el ciclo.
Éstos son la sección pertinente de 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);
}
No inconveniente más allá de unos pocos ciclos de procesador. Pero me gusta entender los matices de cómo funciona el sistema detrás de escena. – stormin986