2012-01-18 10 views
9

Creo sempre due gestori: uno sta eseguendo il wrap sul thread principale, un altro è il wraping su un singolo thread.È questo un modo perfetto per fermare il handlerthread?

È questo un metodo ottimale per avviare e arrestare questi in un ciclo di vita di attività?

HandlerThread safeThread = null; 
Handler safeHandler = null; 
Handler handler = null; 


@Override 
    public void onStart() { 

if (safeThread == null) { 
      safeThread = new HandlerThread("safeThread"); 
      safeThread.start(); 
      safeHandler = new Handler(safeThread.getLooper()); 
     } else if (safeThread.getState() == Thread.State.NEW) { 
      safeThread.start(); 
      safeHandler = new Handler(safeThread.getLooper()); 
     } else if (safeThread.getState() == Thread.State.WAITING) { 
      safeHandler = new Handler(safeThread.getLooper()); 
     } else if (safeThread.getState() == Thread.State.TERMINATED) { 
      safeThread = null; 
      safeThread = new HandlerThread("safeThread"); 
      safeThread.start(); 
      safeHandler = new Handler(safeThread.getLooper()); 
     } 
} 




protected void onStop() { 
     Log.d("x", "onStop is executed"); 
     safeHandler = null; 
     safeThread.quit(); 
     safeThread.interrupt(); 
     safeThread = null; 
     super.onStop(); 
    } 
+0

safeThread.interrupt(); è il modo migliore per fermare thread – Sameer

+0

sì, lo so, ma io penso che questo è sicuro quando io dopo interrompere e null questo. – rex

+1

ho dato una risposta..una cosa ti suggerisco come sei nuovo su stackoverflow.IF vuoi apprezzare qualcuno aiuto poi dargli un voto e se pensi che la risposta sia meglio allora contrassegnala come risposta .. :) benvenuto e applausi – Sameer

risposta

0

È possibile utilizzare questo come un modo sicuro per fermare le discussioni:

if (safeThread!= null) { 
    Thread moribund = safeThread; 
    safeThread = null; 
    moribund.interrupt(); 
} 
+1

Per ulteriori dettagli, consulta questo http://stackoverflow.com/questions/680180/where-to-stop-destroy-threads-in-android-service-class – Sameer

+0

puoi spiegare maggiori dettagli ?? quale motivo ?? – rex

+0

Per Motivo vedi domanda nel mio commento sopra – Sameer

15

So che è una domanda un po 'vecchio, ma ho imbattersi in essa cercando la stessa risposta e l'ulteriore ricerca I don' t che la risposta corrente applica molto bene al HandlerThread (anche se assolutamente corretto per filettature normali)

HandlerThread avere incorporati metodi quit() e quitSafely (API18) per fermare il filo. https://developer.android.com/reference/android/os/HandlerThread.html#quit()

la differenza tra i due è solo se i messaggi in coda saranno trattati prima che si fermi o no.

modo di rispondere, è il più semplice:

safeThread.quit(); 
+0

Per aggiungere chiarezza: quit() è disponibile in API 5 – Vyrx

+2

Cosa fare prima di API 18? – JohnyTex

+0

Quit() o quitSafely() interrompe Thread o solo il Looper che thread deve gestire i messaggi? Non spiega se finisce thread o non [qui] (https://developer.android.com/reference/android/os/HandlerThread.html#quit()). – Thracian

8

Se si avvia il thread come questo:

HandlerThread thread = new HandlerThread("MyHandlerThread"); 
thread.start(); 

Il modo più sicuro per fermare sarebbe:

thread.quitSafely(); 

quitSafely assicura che tutti i messaggi in sospeso vengano elaborati prima della discussione fermate.

Nota: La mia risposta originale prevedeva un ulteriore invito a Thread.join, ma ho trovato il join chiamata non rilascia in modo affidabile quando utilizzato dopo quitSafely.

+0

Mi chiedo anche se ho bisogno di aderire dopo aver smesso. Puoi chiarire "non rilascia in modo affidabile"? Grazie! – Kaifei

+0

@ Kaifei Ricordo che stavo osservando che la chiamata di join blocca solo il thread. Era di nuovo in agosto, quindi non sicuro al 100%. – SharkAlley

Problemi correlati