2013-07-30 11 views
7

Mam HandlerThread, do którego ciągle wysyłam działający co 5 sekund. Coś takiego:Jak bezpiecznie wyjść z lokaja HandlerThreada

HandlerThread thread = new HandlerThread("MyThread"); 
thread.start(); 
Handler handler = new Handler(thread.getLooper()); 
handler.post(new Runnable() { 
    public void run() { 
    //... 
    handler.postDelayed(this, 5000); 
    } 
}); 

muszę opuścić looper w pewnym momencie, po 60 sekundach czy coś takiego .. więc piszę:

mainHandler = new Handler(Looper.myLooper()); //main thread's 
mainHandler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
    thread.getLooper().quit(); 
    } 
}, 60000); 

myślę, że to powoduje looper aby zamknąć nagle , więc mogę zacząć to "ostrzeżenie" komunikaty:

w/kolejka komunikatów (3726): java.lang.RuntimeException: Handler (android.os.Handler) {} 4823dbf8 wysyłaniem wiadomości do Handler na martwy wątek

chcę uniknąć tego błędu wiad, pomyślałem, że mogę go rozwiązać za pomocą metody Looper.quitSafely() .. ale sprawdziłem API i nie jest już dostępny. Czy ktoś wie, co się z nim stało? (To nie jest przestarzałe jak niektóre inne metody).

Czy istnieje sposób na bezpieczne opuszczenie chwytaka? Dzięki!

+0

zaprzestania wysyłania handler.postDelayed (to 5000) opóźniony Runnables – pskink

+0

jak przy użyciu flagę lub coś? – sundie

+0

może mógłbyś wypróbować thread.getLooper(). QuitSafely()? – Richard

Odpowiedz

0

Im nie wątek guru, ale w ten sposób można uzyskać kierunek:

... 
_thread.setRunning(true); 
_thread.start(); 

.. 

public void stopThread(){ 
    boolean retry = true; 
    _thread.setRunning(false); 
    while (retry) { 
     try { 
      _thread.join(); 
      retry = false; 
      Log.e("test", "thread stopped"); 
     } catch (InterruptedException e) { 
      Log.e("test", "can't stop thread, retrying..."); 
      // we will try it again and again... 
     } 
    } 
} 

W swoim wątku:

while (isRunning) { 
    //... 
} 

1-ci wszystko wdrożyć run metodę w pętli (while(isRunnig){}).

Po zakończeniu przełączasz flagę na false i "czekasz" na join.

1

Można spróbować użyć wartości boolowskiej, aby sprawdzić, czy kod powinien zostać wykonany. Coś takiego:

private boolean runHandler = true; 

... 

HandlerThread thread = new HandlerThread("MyThread"); 
thread.start(); 
Handler handler = new Handler(thread.getLooper()); 
handler.post(new Runnable() { 
    public void run() { 
     if(runHandler){ 
      //... 
      handler.postDelayed(this, 5000); 
     } 
    }  
}); 

mainHandler = new Handler(Looper.myLooper()); //main thread's 
mainHandler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     runHandler = false; 
    } 
}, 60000); 
+0

dzięki, to proste obejście :) – sundie

+0

co jeśli mam wiele handlerthreads choć? Chodzi mi o to, że nie chciałbym mieć jednego boolowskiego dla każdego wątku ...: P – sundie

+0

Tak, w takim przypadku powinieneś poszukać sposobu na zatrzymanie Handler'a. Myślę, że Handler-> removeCallbacks działałby, gdyby wiadomość była w kolejce, ale jeśli Handler jest wykonywany, nie jestem pewien, czy to zatrzymałoby wykonanie. –