Análisis avanzado avanzado de Android del mecanismo de mensajes

Análisis avanzado avanzado de Android del mecanismo de mensajes

Tiempo de lectura: 8 minutos

¿Estás sentado quieto? Yendo a conducir


Escribir al frente

El contenido compartido hoy es un análisis en profundidad del mecanismo de mensajes de Android Algunas personas han preguntado, ¿se pueden usar algunas funciones? ¿Por qué analizar el código fuente subyacente? Lo que Xiaolu le dice hoy es que muchos proyectos de código abierto ya no nos necesitan para construir ruedas, y qué estúpido es reconstruir ruedas. Sin embargo, el código fuente subyacente de Android y la realización de algunas funciones nos permiten aprender el patrón subyacente y la implementación lógica.

Lo más importante sobre el aprendizaje de la programación es el pensamiento lógico. Incluso si puede lograr cualquier función, no puede hacer nada con poca capacidad de pensamiento lógico. Su capacidad de pensamiento lógico es pobre y su altura se ha determinado en la ruta técnica.

Mecanismo de mensajes de Android

El mecanismo de mensajes de Android significa principalmente que la operación de Handler necesita el soporte de MessageQueue y Looper subyacentes.

(1) La traducción al chino de MessageQueue es una cola de mensajes. Proporcione inserción y eliminación de trabajo externamente en forma de cola. Aunque se denomina cola de mensajes, la estructura de almacenamiento interno no es una cola real, sino una estructura de datos de lista enlazada individualmente para almacenar la lista de mensajes.

(2) La traducción al chino de Looper es bucle, lo llamamos bucle de mensaje. Dado que MessageQueue es solo una unidad de almacenamiento, no procesará mensajes. Looper compensa esta función. Looper buscará nuevos mensajes en un bucle infinito y procesará los mensajes si los hay, de lo contrario esperará para siempre.

Aprendiendo mapa mental:

Xiaolu organiza cuidadosamente los mapas mentales de los artículos futuros para todos, de modo que cada artículo compartido tenga una estructura clara, que favorezca la revisión y la organización.

Análisis avanzado avanzado de Android del mecanismo de mensajes

1. Descripción general del mecanismo de mensajes de Android

El mecanismo de mensajes de Android se refiere principalmente al mecanismo operativo de Handler y al proceso de trabajo de MessageQueue y Looper adjuntos a Handler. La función principal de Handler es cambiar una tarea a un subproceso específico para su ejecución.

Visión general

(1) Pensando: ¿Por qué Android proporciona esta función?

Respuesta: Debido a que Android estipula que solo se puede acceder al hilo de la interfaz de usuario en el hilo principal, si se accede a la interfaz de usuario en el hilo secundario, el programa lanzará una excepción.

(2) Código fuente: después de verificar el código fuente, el método checkThread () verifica si la interfaz de usuario de actualización está actualizada en el hilo principal y arroja un mensaje de excepción para recordarle al desarrollador (creo que esto se ha encontrado en el desarrollo).

(3) Proceso: debido a las restricciones anteriores, esto requiere que los desarrolladores actualicen la interfaz de usuario en el hilo principal, pero Android también recomienda no hacer un trabajo que consuma mucho tiempo en el hilo principal, de lo contrario, la aplicación no responderá a ANR. Teniendo en cuenta esta situación, cuando extraemos información del servidor y la mostramos en la interfaz de usuario, haremos el trabajo de extracción en el subproceso secundario. Una vez que se completa la extracción, la interfaz de usuario no se puede actualizar directamente en el subproceso secundario. Sin el controlador, entonces, de hecho, no hay forma de cambiar el trabajo de acceder a la interfaz de usuario al hilo principal para su ejecución. Por lo tanto, la razón principal por la que el sistema nos proporciona Handler es resolver la contradicción de que no se puede acceder a la UI en el hilo secundario.

(4) Pregunta:

① 为什么不能再子线程中更新 UI? 
答 : 因为 Android 的 UI 控件不是线性安全的。如果在多线程中并发的访问可能会导致 UI 控件处于不可预期的状态。

② 为什么不对 UI 控件的访问加上锁机制呢? 

答 :首先,加上锁机制会让访问 UI 变的复杂,其次锁机制会降低 UI 的访问效率,因为锁机制会阻塞某些线程的执行。

La forma más sencilla y eficaz es utilizar un modelo de un solo subproceso para manejar las operaciones de la IU. Solo necesitas cambiar el subproceso de ejecución del acceso a la IU a través de Handlerr.

Cómo funciona Handler

Cuando se crea el Handler, el Looper actual se utilizará para construir el sistema de bucle de mensajes interno.Si no hay ningún Looper actualmente, se informará un error.

¿Cómo solucionar los problemas anteriores? Dos métodos:

① Simplemente cree Looper para el hilo actual.
② También es posible crear un Handler en el hilo de Looper.

principio de funcionamiento

(1) Proceso de creación del controlador: después de que se crea el controlador, MessageQueue y Looper internos funcionan junto con el controlador, y luego se entrega un Runnable al Looper dentro del controlador para su procesamiento a través del método de publicación del controlador; también se puede procesar a través de El método de envío del Handler envía un mensaje, que también es procesado por Looper. De hecho, el método de envío finalmente se completa con el método de envío.

(2) El proceso de trabajo del método de envío: cuando se llama al método de envío del Handler, llamará al método enqueueMessage de MessageQueue para poner el mensaje en la cola de mensajes, y luego Looper procesará el mensaje cuando encuentre un nuevo message, y finalmente el Runnable del mensaje O se llamará al método handlerMessage de Handler.

Análisis avanzado avanzado de Android del mecanismo de mensajes

Dos, análisis del mecanismo de mensajes de Android

Cómo funciona la cola de mensajes

La cola de mensajes en Android se refiere principalmente a MessageQueue, MessageQueue incluye principalmente dos operaciones: insertar y eliminar. La implementación interna de la cola de mensajes no es una cola. De hecho, la cola de mensajes se mantiene a través de la estructura de datos de una lista enlazada individualmente. La lista enlazada individualmente tiene ventajas en la inserción y eliminación.

① Insertar (enqueueMessage): inserta un mensaje en la cola de mensajes. (La implementación del código fuente es la inserción de una lista enlazada individualmente)

② Eliminar (siguiente): saca un mensaje de la cola de mensajes y lo elimina de la cola de mensajes. (El siguiente es un método de bucle infinito, la cola de mensajes se bloquea sin información y la lista vinculada individualmente se elimina cuando llega un nuevo mensaje)

Cómo funciona Lopper

Looper desempeña el papel de bucle de mensajes en el mecanismo de mensajes de Android. Su función es comprobar constantemente si hay mensajes nuevos de MessageQueue. Si hay mensajes, se procesarán de inmediato y, si no hay mensajes, se bloquearán. .

(1) Método de construcción de la lanzadera

① Cree una cola de mensajes MessageQueue.

② Guarde el objeto del hilo actual.

(2) Cómo crear Looper para un hilo

(El trabajo de manejo requiere Looper, sin Looper, se informará un error)

 ① 通过 Looper.prepare() 方法为线程创建一个 Looper 。

 ② 通过 Looper.loop() 方法来开启消息循环。

(3) Otra forma de crear hilos

① 主线程 Looper 的获取。 Looper 这个方法主要给线程也就是 ActivityThread 创建 Looper 使用的,本质也是通过 prepare 来实现的,由于主线程的 Looper 比较特殊,所以 Looper 提供了一个 getMainLopper 的方法获取主线程的 Looper。

② Looper 的退出。****Looper 提供了两个方法:quit 方法和 quitSafely 方法。

La diferencia entre los dos: Salir sale de Looper directamente.

Y quitSafely simplemente establece una marca de salida y luego sale después de procesar los mensajes en la cola de mensajes.

(4) El principio de realización del método Looper.loop ()

loop 是一个死循环,唯一能跳出循环的方法就是 MessageQueue 的 next 方法返回了 null。当 Looper 的 quit 方法被调用时,MessageQueue 的 quit 方法或者 quitSafely 方法就会通知消息队列退出,当消息队列被标记为退出状态时,next 就会返回一个 null。Looper 是必须退出的,否则 loop 会永远循环下去。 

El método de bucle llamará al siguiente método de MessageQueue para obtener el mensaje. Si MessageQueue no tiene mensajes, el siguiente estará en un estado de bloqueo y el método de bucle también estará en un estado de bloqueo.

Explicar el principio de funcionamiento de Handler en detalle.

El trabajo principal de Handler es enviar y recibir mensajes. El mensaje se puede enviar a través de una serie de métodos de envío y una serie de métodos de envío. La serie de métodos de envío finalmente se realiza a través de una serie de métodos de envío.

Código:


 1public class HandlerActivity extends Activity {
 2
 3    @Override
 4    protected void onCreate(@Nullable Bundle savedInstanceState) {
 5        super.onCreate(savedInstanceState);
 6        setContentView(R.layout.activity_main);
 7
 8        //开启线程
 9        handler();
10    }
11    //主线程
12    Handler handler = new Handler(){
13
14        @Override
15        public void handleMessage(Message msg) {
16            super.handleMessage(msg);
17            switch (msg.what) {
18                case 1:
19                    // 获取Message里面的复杂数据
20                    Bundle date = new Bundle();
21                    date = msg.getData();
22                    String name = date.getString("name");
23                    int age = date.getInt("age");
24                    String sex = date.getString("sex");
25                    //这里是主线程,可进行对UI的更新
26                    textView.setText(name)
27            }
28        }
29    };
30
31    //子线程
32    public void handler(){
33        new Thread(new Runnable() {
34            @Override
35            public void run() {
36                Message message = new Message();
37                message.what = 1;
38
39                // Message对象保存的数据是Bundle类型的
40                Bundle data = new Bundle();
41                data.putString("name", "李文志");
42                data.putInt("age", 18);
43                data.putString("sex", "男");
44                // 把数据保存到Message对象中
45                message.setData(data);
46                // 使用Handler对象发送消息
47                handler.sendMessage(message);
48            }
49        }).start();
50    }
51}

enviar mensajes

A través del análisis del código fuente, el proceso de Handler que envía un mensaje es solo para insertar un fragmento de información en la cola de mensajes, y el siguiente método de MessageQueue devolverá este fragmento de información a Looper, y Looper lo procesará inmediatamente después de recibir el message, y Looper se lo entregará a Handler para procesar el mensaje, se llamará al método dispatchMessage de Handler y luego Handler entrará en la etapa de procesamiento de mensajes.

Procesamiento de mensajes

Análisis avanzado avanzado de Android del mecanismo de mensajes

En un análisis en profundidad del código fuente de dispatchMessage, el Handler procesa el mensaje de la siguiente manera:

① Primero verifique si la devolución de llamada de Message es nula. Si no es nula, procese el mensaje mediante handlerCallback. (La devolución de llamada de Message es un objeto d Runnable, que en realidad es el parámetro Runnable pasado por el método post)

② En segundo lugar, compruebe si mCallback es nulo. Si no es nulo, llame al método handlerMessage de mCallback para procesar el mensaje. La devolución de llamada es una interfaz.

③ A través de la devolución de llamada, podemos utilizar los siguientes métodos para crear objetos Handle.


1Handler handler = new Handler(callback);

El significado de esta creación es crear una instancia pero no necesita derivar una subclase de Handler.

④ Sin embargo, en nuestro desarrollo diario, a menudo derivamos una subclase de Handler y anulamos su método handleMessage para procesar mensajes específicos. Si no desea crear una subclase derivada, puede usar Callback.

Bucle de mensaje del hilo principal

El hilo principal de Android es ActivityThread. El método de entrada del hilo principal es main. En el método principal, el sistema usará Looper.prepareMainLooper (); para crear el Looper y MessageQueue del hilo principal, y usar Looper.loop ( ) para abrir el mensaje del ciclo del hilo principal.

Una vez que se inicia el bucle de mensajes del hilo principal, ActivityThread también necesita un Handler para interactuar con la cola de mensajes. Este Handler es ActivityThread.H. ActivityThread se comunica entre procesos a través de ApplicationThread y AMS. Una vez que AMS completa la solicitud de ActvityThread por medio de la comunicación entre procesos, volverá a llamar al método Binder en ApplicationThread, y luego ApplicationThread enviará un mensaje a H, y H cambiará la lógica en ApplicationThread a ActivityThread al recibir el mensaje. Ejecutar en el medio, es decir, cambiar al hilo principal para su ejecución. Este proceso es el modelo de bucle de mensajes del hilo principal.

Supongo que te gusta

Origin blog.51cto.com/15064450/2602814
Recomendado
Clasificación