Mecanismo y principios de mensajería de Android

Mecanismo de mensajes de Android y sus principios

El principio de Handle

andriod 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.

MessageQueue

MessageQueue es una lista vinculada que contiene mensajes (enviados en Looper). El mensaje no se agrega directamente a MessageQueue, sino que se realiza a través del controlador asociado con Looper.

Se utiliza para almacenar mensajes colocados por hilos. La lectura eliminará automáticamente los mensajes. El mantenimiento de una lista enlazada única tiene ventajas en la inserción y eliminación. En su next(), habrá un bucle infinito, comprobando constantemente si hay un mensaje, y si lo hay, el mensaje será devuelto y eliminado.

Looper

Un hilo puede generar un objeto Looper, que administra el MessageQueue en este hilo.

Cuando se crea Looper, creará un MessageQueue y un bucle de llamada. (), se inicia el bucle de mensajes. Loop () también es un bucle infinito. Llamará continuamente a next () de messageQueue. Cuando haya un mensaje, se procesará; de lo contrario, se bloqueará en next () de messageQueue. . Cuando se llama a quit () de Looper, se llamará a quit () de messageQueue. En este momento, next () devolverá nulo y luego el método loop () también saldrá.

MessageQueue y Looper tienen una relación uno a uno, y Handler y Looper tienen una relación de muchos a uno

Handler

Construya un Handler en el hilo principal para comunicarse con Looper para enviar nuevos mensajes a MessageQueue;

Recibir el mensaje enviado por el Handler que Looper recupera de MessageQueue. Luego llame a sendMessage() en otros hilos. En este momento, se insertará un mensaje en el MessageQueue del hilo principal y luego lo utilizará Looper.

Thread

UIthread suele ser el hilo. hilo principal y se inicia Android El programa creará un MessageQueue para él. El hilo principal del sistema abre el hilo principal para la entrada en main () de ActivityThread, que define una serie de tipos de mensajes, incluido el inicio y la parada de los cuatro. componentes principales.

Código fuente del algoritmo de distribución de cola de mensajes

Cada mensaje se toma de la mano y conoce los mensajes anteriores y posteriores.

Los mensajes se ordenan por marca de tiempo. Los más pequeños son. Antes

Coopere con el identificador para eliminar el mensaje. Cuando se acabe el tiempo del mensaje, el primer mensaje de la cola se eliminará. Después de eliminarlo, el segundo mensaje se establecerá como nulo. ocupará el primer lugar, y así sucesivamente

// Almacenamiento de mensajes

boolean enqueueMessage(Mensaje de mensaje, largo cuando) {

sincronizado (esto) {

msg.when = cuando;

Mensaje p = mMessages;? //Anotación 1

if (p == null || cuando == 0 || cuando < p.when){

msg.next = p;

mMessages = msg; //Nota 2

} else {

Mensaje anterior;

for (;;) { ? //Nota 3

prev = p;

p = p.next;

if (p == null || cuando < p.when ) {

descanso;

}

}

msg.next = p;

prev.next = msg;

}

}

devuelve verdadero;

}