análisis de objetos looper

Objeto Looper

Inicialización
Primero use sThreadLocal.get() para determinar si el hilo actual tiene un Looper, si hay uno, se lanzará una excepción y threadlocal asegura que el looper es único en el hilo.
De lo contrario, inicialice un objeto looper para el subproceso actual y colóquelo en el threadlocalmap a través de threadlocal.
Cree una cola para guardar y guarde la instancia del hilo.

Comience a ejecutar
looper.loop() para iniciar un ciclo infinito y llame a message.next() para obtener el mensaje.
En el método next(), compruebe si hay un mensaje al principio de la cola. Si hay un mensaje, compare el tiempo de ejecución con el tiempo actual. Si no se ha cumplido el tiempo, llame a nativePollOnce para bloquear durante un período de hora (la hora de ejecución del mensaje al principio de la cola - la hora actual) y luego sacar el mensaje al principio de la cola para ejecutarlo.
Si no hay ningún mensaje, también duerme (bloquea), libera recursos de la CPU y espera a que el mensaje se despierte y vuelva a ejecutarse.
Pero ANR no ocurrirá, ANR se debe a que el usuario no puede obtener una respuesta después de que el tiempo exceda el tiempo, y no hay ningún evento para procesar aquí.
Dado que dormirá (bloqueará), el ciclo infinito no causará desperdicio de recursos.

El subproceso que finalmente ejecutará el controlador depende del subproceso en el que se encuentre el looper, y el método de ejecución es el método de envío del mensaje del controlador enviado.

Cómo insertar datos
El controlador pasa un looper durante la inicialización, por lo que el controlador puede almacenar datos en la cola de mensajes que tiene el looper llamando al método enqueueMessage() de la cola de mensajes en el looper.

Terminar el subproceso de servicio
Llamar a quit() en el objeto mLooper saldrá del bucle de mensajes, porque el subproceso no tiene otras operaciones, por lo que todo el subproceso también terminará.
Cabe señalar que cuando finaliza el bucle de mensajes de un hilo, no se le pueden enviar más mensajes; de lo contrario, se generará una excepción "RuntimeException: Handler{4051e4a0} enviando mensaje a un controlador en un hilo inactivo". Por lo tanto, se recomienda llamar a Looper.myLooper() para obtener una referencia a este Looper después de Looper.prepare(). Uno es para la terminación (se debe llamar a quit() en el objeto); el otro es para verificar cuando se reciben mensajes. Si el bucle de mensajes ha finalizado (como en el ejemplo anterior).

Usar Looper también es muy simple, y sus métodos son relativamente pocos, y hay cuatro de uso común:
public static prepare(); inicialice
public static myLooper(); obtenga la instancia de subproceso actual
public static loop(); abra el bucle
public void salir(); salir

Resumen
1. El método estático prepareMainLooper() se usa para crear un objeto Looper en el subproceso principal. Cada aplicación ha llamado a este método en el método estático main() de ActivityThread, por lo que los desarrolladores no pueden usar este método para crear un objeto Looper nuevamente.

2. El método estático prepare() está reservado para que los desarrolladores creen objetos Looper en subprocesos de trabajo

5. La clase Looper contiene un sMainLooper, que siempre apunta al objeto Looper creado en el subproceso principal.

6. La clase Looper contiene un objeto ThreadLocal, que es responsable de mantener el objeto Looper como una variable local de subproceso.

Supongo que te gusta

Origin blog.csdn.net/weixin_44380181/article/details/129738634
Recomendado
Clasificación