2010-05-08 19 views
13

Tengo un hilo que utilizo para actualizar periódicamente los datos en mi actividad. Creo el hilo y comienzo un looper para usar un manejador con postDelay(). En onDestroy() para mi actividad, llamo removeCallbacks() en mi controlador.Android: ¿Salir del Looper?

¿Debo entonces llamar al handler.getLooper().quit()? ¿O no te preocupes por eso y deja que el sistema operativo se encargue de eso? ¿O simplemente se ejecutará para siempre, consumiendo ciclos de CPU?

Respuesta

0

Ahora no tengo la respuesta correcta, pero a juzgar por varias documentaciones y tutoriales que he visto en Internet, ninguno de ellos llama a handler.getLooper(). Quit(). Así que supongo que no es necesario hacer esto explícitamente.

Pero realmente no hay ningún inconveniente si solo agrega este delineador a su método onDestroy()?

+3

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

16

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); 
} 
+1

Puedo confirmar que esto funciona. –

Cuestiones relacionadas