2010-05-08 5 views
13

Ho una discussione che uso per aggiornare periodicamente i dati nella mia attività. Creo il thread e avvio un looper per l'utilizzo di un gestore con postDelay(). In onDestroy() per la mia attività, chiamo removeCallbacks() sul mio gestore.Android: uscita dal Looper?

Devo quindi chiamare handler.getLooper().quit()? O non ti preoccupare e lascia che il sistema operativo si occupi di esso? O potrebbe semplicemente funzionare all'infinito, consumando cicli di CPU?

risposta

0

Non ho la risposta corretta, ma a giudicare da diverse documentazioni e tutorial che ho visto su Internet, nessuno di loro chiama handler.getLooper(). Quit(). Quindi suppongo che non sia necessario farlo esplicitamente.

Ma non c'è davvero alcun inconveniente se si aggiunge questo one-liner al proprio metodo onDestroy()?

+3

n inconveniente di là di alcuni cicli di processore. Ma mi piace capire le sfumature di come il sistema funziona dietro le quinte. – stormin986

16

Secondo lo Android Documentation è necessario chiamare quit().

Quando si chiama Looper.loop() un ciclo while viene avviato. Chiamando Looper.quit() si termina il ciclo. Il garbage collector non può raccogliere il tuo oggetto mentre il ciclo è in esecuzione.

Ecco relativa sezione da 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

Posso confermare che questo funziona. –