Colección de citas famosas - Slogan de motivación - Android——Mecanismo de distribución de mensajes

Android——Mecanismo de distribución de mensajes

¿Qué es el mecanismo Handler?

El mecanismo Handler es un mecanismo de comunicación utilizado para la comunicación entre subprocesos en Android.

¿Por qué Handler? ¿Por qué se menciona tantas veces el mecanismo Handler?

A partir de Android 4.0, las solicitudes de red en Android no pueden operarse en el subproceso principal y las operaciones para actualizar la interfaz de usuario no pueden ejecutarse en subprocesos secundarios. Al ejecutar una solicitud de red en un subproceso secundario y obtener los datos devueltos por el servidor, es necesario actualizar la interfaz de usuario. Debido a los requisitos del sistema, es probable que surja una contradicción: los datos están en el subproceso y la actualización de la interfaz de usuario debe estar en el hilo principal. En este momento debemos devolver los datos al hilo principal y se crea el mecanismo Handler.

En Android, las operaciones que consumen mucho tiempo se realizan en el hilo principal. En el peor de los casos, la interfaz de usuario se congelará y, en el peor de los casos, dejará de responder y provocará un cierre forzado. Al mismo tiempo, después de Android 3.0, las solicitudes de red en el hilo principal están prohibidas.

Para operaciones de red o que requieren mucho tiempo, las operaciones directas no se pueden realizar en el hilo principal. Deben operarse en un subproceso o en un hilo de trabajo. Una vez completada la operación, el hilo principal. es decir, el hilo de la interfaz de usuario se actualiza. Esto implica un problema. Una vez completada la ejecución del subproceso, ¿cómo se puede actualizar al hilo principal, es decir, el hilo de la interfaz de usuario? Para resolver el problema anterior, es necesario utilizar el mecanismo de mensajes de Android, a saber: Handler, Message, MessageQueue, Looper

Los cuatro objetos más importantes del mecanismo Handler

Método de construcción del Handler:

Looper:

Uso del controlador:

MessageQueue:

Looper.loop()

Handler.dispatchMessage()

Razones por las que el controlador provoca actividad pérdidas de memoria:

Los mensajes enviados por el controlador están en la cola de mensajes del controlador actual. Si la actividad finaliza en este momento, el controlador aún procesará los mensajes en la cola de mensajes. el controlador se declara como una clase interna (clase interna no estática), sabemos que la clase interna naturalmente contiene la referencia de instancia de la clase externa, por lo que cuando el mecanismo de recolección de basura del GC se recicla, se descubre que esta Actividad en realidad tiene otras referencias, por lo que esta Actividad no será reciclada, lo que dará lugar a fugas de actividad.

Si se realiza una operación que requiere mucho tiempo en un subproceso secundario y la operación del usuario ingresa a otra actividad, la memoria reciclará MainActivity, pero en este momento se descubre que el Handler todavía está Hace referencia a MainActivity y la memoria no se puede utilizar a tiempo Reciclaje, lo que provoca pérdidas de memoria.

Formas comunes para que Handler evite pérdidas de memoria:

¿Por qué los resultados de los subprocesos se pueden notificar o llevar al subproceso de la interfaz de usuario a través de Handler?

El controlador aquí se refiere al controlador del hilo principal, y el Looper coincide con el controlador. El MessageQueue se inicializa en el hilo de la interfaz de usuario, por lo que llamar al controlador en el hilo secundario para enviar mensajes puede actualizar el. Hilo de interfaz de usuario.

Looper está en el código fuente del hilo de la interfaz de usuario, en la clase ActivityThread: