2013-07-30 11 views
7

Ich habe eine HandlerThread, auf die ich alle 5 Sekunden eine lauffähige veröffentlichen. Etwas wie folgt aus:Wie HandlerThread Looper sicher zu beenden

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

Ich brauche den Looper zu einem bestimmten Zeitpunkt zu beenden, nach 60 Sekunden oder so ähnlich .. so ich schreibe:

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

Ich denke, das den Greifer bewirkt abrupt zu beenden , so beginne ich diese "Warnung" -Meldungen erhalten:

W/Message (3726): java.lang.RuntimeException: Handler (android.os.Handler) {} 4823dbf8 Nachricht an einen Handler auf einem toten Senden Gewinde

ich diesen Fehler msg vermeiden wollen, dachte ich, dass ich es mit Hilfe der Looper.quitSafely() Methode lösen könnte .. aber ich überprüfte die API und es ist nicht mehr verfügbar. Weiß jemand, was passiert ist? (Es ist nicht veraltet wie einige andere Methoden).

Gibt es eine Möglichkeit, den Looper sicher zu verlassen? Vielen Dank!

+0

Stop Senden handler.postDelayed (this, 5000) verzögert Runnables – pskink

+0

wie eine Fahne oder etwas mit? – sundie

+0

vielleicht könnten Sie versuchen thread.getLooper(). QuitSafely()? – Richard

Antwort

0

Im Fädeln Guru nicht, aber auf diese Weise können Sie eine Richtung geben:

... 
_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... 
     } 
    } 
} 

In Thread:

while (isRunning) { 
    //... 
} 

1. alle run Methode in Schleife (while(isRunnig){}) implementieren.

Am Ende wechseln Sie das Flag auf "false" und "warten" auf join.

1

Sie könnten versuchen, einen booleschen Wert zu verwenden, um zu wissen, ob der Code ausgeführt werden soll. Etwas wie folgt aus:

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

danke, das ist ein einfacher Workaround :) – sundie

+0

was ist, wenn ich viele viele handleThreads obwohl? Ich meine, ich wollte keinen booleschen Wert für jeden Thread behalten ...: P – sundie

+0

Ja, in diesem Fall sollten Sie nach einem Weg suchen, den Handler zu stoppen. Ich denke, Handler-> removeCallbacks würde funktionieren, wenn die Nachricht in der Warteschlange ist, aber wenn der Handler ausgeführt wird, bin ich nicht sicher, ob das die Ausführung stoppen würde. –

Verwandte Themen