2012-01-18 19 views
9

Siempre creo dos controladores: uno es wraping en el hilo principal, otro es wraping en un solo hilo.¿Es esta una forma perfecta de detener handlerthread?

¿Es este el mejor método para iniciar y detener estos en un ciclo de vida de la actividad?

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(); es la mejor manera de detener el hilo – Sameer

+0

sí, lo sé, pero estoy pensando en esto es seguro cuando después de interrumpir y anular esto. – rex

+1

he dado respuesta ... una cosa que te sugeriría, ya que eres nuevo en stackoverflow. Si quieres agradecer a alguien, entonces dale un voto y si crees que la respuesta es mejor, márcalo como respuesta ... :) bienvenido y cheers – Sameer

Respuesta

0

Usted puede utilizar esto como una forma segura de detener las discusiones:

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

Para obtener más detalles, consulte este http://stackoverflow.com/questions/680180/where-to-stop-destroy-threads-in-android-service-class – Sameer

+0

¿Puede explicarnos más detalles? Cuál es la razón ?? – rex

+0

Por Motivo ver pregunta en mi comentario anterior – Sameer

15

Sé que es una pregunta un poco viejo, pero me tropiezo a través de ella buscando la misma respuesta y la investigación de I don más' t creen que la respuesta actual se aplica muy bien a HandlerThread (aunque absolutamente correcto para roscas normales)

HandlerThread tener una orden interna del quit() y quitSafely (API18) métodos para dejar el hilo. https://developer.android.com/reference/android/os/HandlerThread.html#quit()

la diferencia entre los dos es solo si los mensajes en la cola se procesarán antes de que se detengan o no.

por lo que responder, es tan simple como:

safeThread.quit(); 
+0

Para agregar claridad: dejar de fumar() está disponible en API 5 – Vyrx

+2

¿Qué hacer antes de la aplicación 18? – JohnyTex

+0

¿Salir() o salir seguro() detiene el hilo o solo el Looper que el hilo tiene para manejar los mensajes? No explica si termina el hilo o no [aquí] (https://developer.android.com/reference/android/os/HandlerThread.html#quit()). – Thracian

8

si se inicia el hilo de la siguiente manera:

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

La forma más segura de evitar que sería:

thread.quitSafely(); 

quitSafely asegura que todos los mensajes pendientes se procesen antes del hilo se detiene

Nota: Mi respuesta original incluía una llamada adicional a Thread.Join, pero encontré el unen llamada no da a conocer de forma fiable cuando se usa después quitSafely.

+0

También me pregunto si necesito unirme después de dejar de usar Safely. ¿Puedes aclarar "no se publica confiablemente"? ¡Gracias! – Kaifei

+0

@Kaifei Recuerdo que estaba observando que la llamada de unión simplemente bloquea el hilo. Eso fue en agosto, entonces no estoy 100% seguro. – SharkAlley

Cuestiones relacionadas