Explicación detallada de Handler en Android y la diferencia con Thread
Android proporciona Handler y Looper para satisfacer la comunicación entre subprocesos. Principio del manejador primero en entrar, primero en salir. La clase Looper se utiliza para gestionar el intercambio de mensajes (MessageExchange) entre objetos dentro de un hilo específico.
Looper: un hilo puede generar un objeto Looper, que administra el MessageQueue (cola de mensajes) en este hilo. ?
Handler: puede construir un objeto Handler para comunicarse con Looper para enviar nuevos mensajes a MessageQueue o recibir mensajes enviados por Looper desde Message Queue.
Message Queue (cola de mensajes): se utiliza para almacenar mensajes colocados por hilos. ?
Subproceso: UIthread suele ser el subproceso principal y Android creará un MessageQueue para él cuando inicie el programa. ?
1. El controlador crea un mensaje
Cada mensaje debe ser procesado por un controlador designado. Esta función se puede completar creando un mensaje a través del controlador. El grupo de mensajes se introduce en el mecanismo de mensajería de Android. Cuando el controlador crea un mensaje, primero pregunta si hay un mensaje en el grupo de mensajes. Si hay un mensaje, lo obtiene directamente del grupo de mensajes. De lo contrario, se reinicializa una instancia de mensaje. La ventaja de usar el grupo de mensajes es que cuando el mensaje no se usa, no se recolecta como basura, sino que se coloca en el grupo de mensajes para usarlo la próxima vez que el controlador cree un mensaje. El grupo de mensajes mejora la reutilización de objetos de mensajes y reduce la cantidad de recolecciones de basura del sistema. El proceso de creación del mensaje se muestra en la figura.
2. El controlador envía un mensaje
Cuando el hilo principal de la interfaz de usuario inicializa el primer controlador, creará un Looper a través de ThreadLocal, que corresponde al hilo principal de la interfaz de usuario uno a uno. El propósito de utilizar ThreadLocal es garantizar que cada hilo cree solo un Looper. Posteriormente, cuando se inicializan otros Handlers, obtienen directamente el Looper creado por el primer Handler. Cuando se inicializa Looper, se creará una cola de mensajes MessageQueue. En este punto, la relación entre el hilo principal, el bucle de mensajes y la cola de mensajes es 1:1:1.
El proceso de inicialización de Handler, Looper y MessageQueue se muestra en la figura:
Hander contiene una referencia a la cola de mensajes del hilo principal de la interfaz de usuario MessageQueue y al bucle de mensajes Looper. puedo usar Handler para El mensaje se envía a la cola de mensajes MessageQueue del hilo de la interfaz de usuario.
3. El controlador procesa los mensajes
El hilo principal de la interfaz de usuario consulta la cola de mensajes UI_MQ a través del bucle Looper. Cuando se encuentra un mensaje, lo sacará de la cola de mensajes. Primero analice el mensaje, determine el controlador correspondiente al mensaje a través de los parámetros del mensaje y luego distribuya el mensaje al controlador especificado para su procesamiento.
El proceso de comunicación entre el subproceso y el hilo principal de la interfaz de usuario a través de Handler y Looper se muestra en la figura.