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) { p>
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;
}