2012-05-23 18 views
10

En Android, Handler se puede utilizar para publicar/manejar mensajes, si no utilizo HandlerThread (paso su Looper a Handler), significa que en este caso Handler usa MainThread (UI Thread) ¿Looper?Por qué utilizar HandlerThread en Android

¿Qué resultado obtendrá si Handler usa MainThread's Looper? ¿Puede causar mainThread bloqueado?

Respuesta

4

Como Doc dice:

clase práctica para iniciar un nuevo hilo que tiene un looper.
El looper se puede usar para crear clases de controlador.
Tenga en cuenta que start() todavía debe ser llamado.

HanderThread clase hereda de la clase Thread, que encapsula el objeto Looper, de modo que no nos importa la lanzadera se abren y sueltan detalles. Como en el caso de un hilo normal, necesitamos usar Looper.prepare() y Looper.loop() para convertirlo como LooperThread.

4

modo Normal para usar HandlerThread así:

HandlerThread thread = new HandlerThread("A Handler Thread"); 
thread.start(); 
Handler handler = new Handler(thread.getLooper()){ 
    @Override 
    public void handleMessage(Message msg) 
    { 
    //.... 
    } 
}; 

Debido HandlerThread puede crear un looper de Handler, es una especie de forma conveniente.

Cuando se crea un nuevo Handler, que se une a la cola de hilo/mensaje del hilo que se está creando - ver documentos oficiales ...

+0

Se trata de los documentos oficiales. 'Clase útil para comenzar un nuevo hilo que tiene un looper. El looper se puede usar para crear clases de controlador. Tenga en cuenta que start() todavía debe ser llamado. 'Ahorré tu tiempo. – UnKnown

10

Se podría utilizar HandlerThread en caso de que desee realizar tareas de fondo una a la vez y desea que esas tareas se ejecuten en el orden de ejecución.

Por ejemplo, si desea realizar varias operaciones de fondo de red una a una.

Sí, HandlerThread tiene su propio looper y se pueden crear manejadores y publicarlo (para que no bloquee el hilo principal).

0

HandlerThread es útil cuando desea ejecutar muchas tareas en segundo plano, ya que tiene su propio looper. Normalmente, si publica un mensaje en un controlador, utiliza el looper de MainThread. Esto significa que la tarea se ejecuta en el subproceso UI. Pero en el caso de HandlerThread, estas tareas se ejecutan en el hilo de trabajo. Se puede encontrar una explicación más detallada here

2

si yo no uso un HandlerThread (pasa su Looper a Handler), quiere decir que en este caso Handler utilizar TrenzadoPrincipal (IU Tema) 's Looper?

Tener un vistazo a la documentación de Handler

Handler() 

constructor por defecto asociados con este controlador de la Looper para el subproceso actual.

Si su tema actual es MainThread, utiliza MainThread (UI Thread) Looper.

Para asociar explícitamente el Controlador a su MainThread (Subproceso UI), escriba el código siguiente.

Handler mHandler = new Handler(Looper.getMainLooper(); 

Si escribir es como abajo, se utiliza HandlerThread Looper.

HandlerThread handlerThread = new HandlerThread("HandlerThread"); 
handlerThread.start(); 
Handler requestHandler = new Handler(handlerThread.getLooper()); 

Si tiene cualquier operación IO en la red Runnable tarea, no se puede usar hilo de la lanzadera principal. En ese caso, HandlerThread es útil para publicar la tarea Runnable realizando la operación de Red IO.

puede encontrar ejemplo de código @How do I fix android.os.NetworkOnMainThreadException?

Qué resultado se obtiene si Handler utiliza Looper de TrenzadoPrincipal? ¿Puede causar mainThread bloqueado?

Si envía muchos eventos a MainThread Looper, se ejecutarán en MainThread (UI Thread). Si las tareas enviadas requieren más tiempo para la ejecución, MainThread se bloqueará.

Comprobar continuación posterior de detalles internos de Looper:

What is the purpose of Looper and how to use it?

Cuestiones relacionadas