2010-05-08 9 views
13

Mam wątek, którego używam do okresowego aktualizowania danych w mojej aktywności. Tworzę wątek i uruchamiam looper'a, aby użyć handler'a z postDelay(). W onDestroy() dla mojej aktywności, wywołuję removeCallbacks() na moim treserze.Android: Rezygnacja z Looper?

Czy powinienem wtedy zadzwonić pod numer handler.getLooper().quit()? A może nie martw się o to i niech system operacyjny sobie z tym poradzi? A może po prostu działałby wiecznie, pochłaniając cykle procesora?

Odpowiedz

0

Nie mam teraz poprawnej odpowiedzi, ale sądząc po kilku dokumentacjach i tutorialach, które widziałem w Internecie, żaden z nich nie wywołuje funkcji handler.getLooper(). Quit(). Zgaduję, że nie jest to konieczne, aby to zrobić w sposób jawny.

Ale czy naprawdę nie ma wady, jeśli po prostu dodajesz tę jedną linijkę do swojej metody onDestroy()?

+3

Nie wadą poza kilku cykli procesora. Ale lubię rozumieć niuanse tego, jak system działa za kulisami. – stormin986

16

Zgodnie z Android Documentation należy wywołać quit().

Po wywołaniu Looper.loop() uruchamiana jest pętla while. Wywołanie Looper.quit() powoduje zakończenie pętli. Śmieciarz nie może odebrać obiektu podczas wykonywania pętli.

Oto odnośny odcinek od 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

Mogę potwierdzić, że to działa. –

Powiązane problemy