Acerca de subprocesos múltiples: lado de Android.Si no has visto mi publicación anterior | Por GodDB | Febrero de 2022
Si no has leído el post anterior
Esta vez, discutiremos cómo comunicarse entre el hilo principal de Android y otros hilos a través de MessageQueue-handler-looper.
Estos ejemplos usarán Handler-Looper-MessageQueue para implementar la comunicación MainThread – OtherThread para una comprensión más profunda de los componentes de comunicación de subprocesos de Android.
Manejador — Looper — Comprender los conceptos básicos de la cola de mensajes
La interfaz de usuario de Android debe ejecutarse en el hilo principal.
Por lo tanto, para enviar mensajes desde otros subprocesos al subproceso de la interfaz de usuario, necesita componentes que puedan comunicarse entre subprocesos, como un patrón productor-consumidor.
- MessageQueue: Búfer para almacenar mensajes (1:1 con Looper)
- Looper: recupera el mensaje de la cola de mensajes y ejecuta el controlador (1: 1 con hilo)
- Manejador: coloque el mensaje pasado por Otro subproceso en MessageQueue y procese el mensaje recuperado por Looper (Looper y 1:N)
- Mensaje: Otro hilo가보낸Mensaje (datos o ejecutable)
Estos Handler, Looper y Message Queue están todos ubicados en el subproceso principal. Cuando se crea el subproceso principal, estos tres componentes se configuran.
Comprender los conceptos básicos de ActivityThread
Cuando se ejecuta la aplicación, se llama a ActivityThread.main() para configurar el hilo principal.
Looper.prepareMainLooper()
Conecte Looper y MessageQueue creando una instancia de Looper y creando un MessageQueue.
Después de crear ActivityThread Looper.loop()
llamada.
La siguiente línea debería ser un tiro, lo que significa, Looper.loop()
Esto significa que la función no puede salir.
Looper.loop()
existe Looper.loopOnce()
es una forma de ejecución infinita.así que eso Looper.loop()
La función no puede salir.
yLooper.loopOnce()
La parte más distintiva es la fila 9.
msg.target es el objeto Handler adjunto al mensaje, Handler.dispatchMessage()
Puede verificar si el mensaje se entrega a través de.
y Handler.dispatchMessage()
Se puede ver que el mensaje se ejecuta a través de la rama según si el mensaje es Ejecutable o de datos.
Cuando se ejecuta en el controlador, los resultados se acumulan y ejecutan en la pila de llamadas del subproceso principal.
Ahora que hemos visto un MessageQueue-Handler-Looper aproximado en acción, vamos a crear cada comunicación.
- otros hilos → hilo principal 통신
- hilo principal → otros hilos 통신
otro hilo → hilo principal
Cómo comunicarse con el hilo principal desde otros hilos es simple.
Al crear un objeto Handler, si se pasa un Looper del subproceso principal, se conectará automáticamente porque hay un MessageQueue en él. Y si pasa el mensaje al controlador, el resto ya está configurado, por lo que todo va de acuerdo con el flujo.
Pasar Runnable como mensaje
Pasar datos como mensaje
hilo principal → otros hilos
Ahora, por otro lado, veamos cómo enviar mensajes desde el hilo principal a otros hilos.
- El hilo principal entrega mensajes al controlador.
- El controlador entrega mensajes a MessageQueue
- El hilo de fondo Looper recibe mensajes de MessageQueue
- Pasar el mensaje recuperado al Manejador
Handler.handleMessage()
implementar- Pila de llamadas de hilo de fondo 에 push()
ejemplo
Aquí hay un ejemplo de cómo verificar si un subproceso en segundo plano se está ejecutando a través del proceso anterior cuando se recibe un evento de clic simple.
Tenga en cuenta que en el ejemplo Looper.myLooper()
Cuando se llama, Looper se importa de LooperMap a Looper, porque la clave de LooperMap es Thread,
Al llamar a Looper.myLooper(), debe llamarse en el subproceso correspondiente para que Looper se asigne al subproceso correspondiente. (Relación Looper y Thread 1:1)
Esta es la serie sobre todo lo relacionado con subprocesos múltiples.
De hecho, hay muchas formas más fáciles de hacer esto con Rxjava y Flow.
gracias por leer.