Red de conocimiento informático - Computadora portátil - ¿Cuáles son los métodos de comunicación entre subprocesos de Android?

¿Cuáles son los métodos de comunicación entre subprocesos de Android?

Proceso: Es una actividad en ejecución de un programa con ciertas funciones independientes en un determinado conjunto de datos. Un proceso es una unidad independiente para la asignación y programación de recursos en el sistema. Hilo: es una entidad del proceso y la unidad básica de programación y despacho de la CPU. Es una unidad básica que es más pequeña que el proceso y puede ejecutarse de forma independiente. El hilo en sí básicamente no posee recursos del sistema, solo algunos recursos que son esenciales durante la operación (como un contador de programa, un conjunto de registros y una pila), pero puede compartir lo que tiene el proceso con otros hilos que pertenecen al mismo. proceso. Diferencias: (1) Un programa tiene al menos un proceso y un proceso tiene al menos un subproceso (2) La escala de división de los subprocesos es menor que la de los procesos, lo que hace que los programas de subprocesos múltiples sean altamente concurrentes; tiene al menos un subproceso durante la ejecución Unidad de memoria independiente, mientras que varios subprocesos comparten memoria, pero no hay un espacio de direcciones separado entre subprocesos. La muerte de un subproceso equivale a la muerte de todo el proceso.

---------------------

1. Método de comunicación entre procesos de Android

1. Paquete Dado que la Actividad, el Servicio y el Receptor pueden transportar el Paquete y transmitir datos a través de Intent, podemos enviar el Paquete que transporta datos al componente de otro proceso a través de Intent en un proceso. Desventaja: los tipos de datos que no son compatibles con el paquete no se pueden transmitir.

2.ContentProvider ContentProvider es uno de los cuatro componentes principales de Android. Almacena datos en una tabla y los proporciona al mundo exterior. Es decir, el proveedor de contenido puede acceder a datos en otras aplicaciones a través de procesos. El uso es heredar ContentProvider e implementar los métodos onCreate, consultar, actualizar, insertar, eliminar y getType. onCreate es responsable de realizar algunos trabajos de inicialización durante la creación. El método para agregar, eliminar, verificar y modificar es consultar y modificar los datos. getType devuelve una cadena que indica el tipo de solicitud de Uri. Después del registro, puede utilizar ContentResolver para solicitar el Uri especificado.

3. Archivo Dos procesos pueden intercambiar datos en el mismo archivo. No solo podemos guardar archivos de texto, sino también conservar objetos en archivos y restaurarlos desde otro archivo. Cabe señalar que pueden ocurrir problemas de concurrencia al leer/escribir al mismo tiempo.

4.Broadcast Broadcast puede enviar transmisiones a todas las aplicaciones del sistema Android, y las aplicaciones que requieren comunicación entre procesos pueden escuchar estas transmisiones.

5. El servicio en modo AIDL es similar al proveedor de contenido y también puede acceder a datos en otras aplicaciones. El proveedor de contenido devuelve objetos Cursor, mientras que el servicio devuelve objetos Java, que pueden comunicarse entre procesos. servicio.

AIDL define la interfaz expuesta por el servidor para ser llamada por el cliente. AIDL permite que el servidor procese en paralelo, mientras que Messenger solo puede ejecutarse en serie después de encapsular AIDL, por lo que Messenger se usa generalmente para pasar mensajes. .

6.Messenger Messenger se implementa en base a AIDL. El servidor (lado pasivo) proporciona un servicio para manejar la conexión del cliente (lado activo), mantiene un controlador para crear el Messenger y devuelve la carpeta del Messenger durante. en enlace. Ambas partes utilizan Messenger para enviar datos y Handler para procesar datos.

Messenger depende de Handler para procesar datos, por lo que es en serie, es decir, cuando Handler recibe varios mensajes, debe ponerse en cola y procesarse en secuencia.

7. Socket El método Socket consiste en intercambiar datos a través de la red. Tenga en cuenta que la solicitud debe realizarse en un subproceso; de lo contrario, el hilo principal se bloqueará. Una vez que el cliente y el servidor establecen una conexión, los datos se pueden transmitir continuamente, lo que es más adecuado para la transmisión de datos en tiempo real

2. Método de comunicación entre subprocesos de Android En términos generales, la comunicación entre subprocesos se refiere principalmente a el hilo principal (también llamado hilo de UI) Hay dos formas principales de comunicarse con los hilos secundarios:

1. Mecanismo AsyncTask AsyncTask, una tarea asincrónica, es decir, cuando el hilo de la UI se está ejecutando, algunos Las operaciones asincrónicas se pueden realizar en segundo plano; AsyncTask hace que sea fácil y correcto usar el subproceso de la interfaz de usuario. AsyncTask permite operaciones en segundo plano y los resultados se devuelven al subproceso de la interfaz de usuario sin utilizar explícitamente un subproceso de trabajo o un mecanismo de controlador. Sin embargo, AsyncTask solo se puede usar para operaciones a corto plazo (operaciones que deberían finalizar en unos pocos segundos como máximo. Si necesita ejecutarse en segundo plano durante mucho tiempo, AsyncTask no es adecuado y solo se puede implementar usando otras API). proporcionado por Java.

2. Mecanismo del controlador El controlador, heredado de la clase Objeto, se utiliza para enviar y procesar objetos de mensaje u objetos ejecutables cuando se crea el Controlador, se asociará con el objeto Looper del hilo actual ( si el Looper del hilo actual está vacío o no existe, se generará una excepción. En este caso, es necesario llamar activamente a Looper.prepare () en el hilo para crear un objeto Looper). La función principal de usar Handler es enviar y procesar objetos Message en el proceso posterior y permitir que otros subprocesos completen una determinada acción (como enviar un objeto Message a través del objeto Handler en el subproceso de trabajo, permitir que el subproceso de la interfaz de usuario actualice la interfaz de usuario y luego, el hilo de la interfaz de usuario obtendrá el objeto Message en MessageQueue (la eliminación del objeto Message se completa mediante su objeto Looper asociado) y responderá en consecuencia).

3. Durante el proceso de entrevista de comunicación entre dos subprocesos de Android, algunos entrevistadores pueden preguntar sobre el método de comunicación entre los subprocesos de Android, porque la mayoría de los programadores se centran principalmente en el subproceso principal y los subprocesos de Android. .Comunicación entre subprocesos, por lo que este problema es fácil de confundir. La comunicación entre el hilo principal y el subproceso puede realizarse a través del controlador en el hilo principal para enviar el mensaje en el subproceso al looper en el hilo principal, o el controlador en el hilo principal envía un ejecutable al looper. a través de correo. Pero el looper existe en el hilo principal de forma predeterminada y no hay ningún Looper en el hilo secundario. ¿Qué debemos hacer? De hecho, el principio es muy simple: vincule el looper al subproceso secundario y cree un controlador. Al enviar un mensaje a través de este controlador en otro hilo, se puede lograr la comunicación entre subprocesos.

Hay dos formas para que un subproceso secundario cree un controlador: Método 1: crear un objeto Looper para el subproceso secundario:

new Thread(new Runnable() {

public void run () {

Looper.prepare(); // Crea un objeto Looper para este hilo. Un Thead tiene solo un objeto Looper

Handler handler = new Handler(){

p>

@Override

public void handleMessage(Mensaje msg) {

Toast.makeText(getApplicationContext(), "handleMessage", Toast.LENGTH_LONG).show();

}

};

handler.sendEmptyMessage(1);

Looper.loop() // Recorre continuamente MessageQueue. para ver si hay mensajes

};

}).start(); ----------

Método 2: obtener el looper del hilo principal o el looper del hilo de la interfaz de usuario:

new Thread(new Runnable() {

public void run() {

p>

Handler handler = new Handler(Looper.getMainLooper()){ // ¡Aquí está la diferencia

@Override

public void handleMessage(Mensaje msg) {

Toast.makeText(getApplicationContext(), "handleMessage", Toast.LENGTH_LONG).show(); >

}

};

handler.sendEmptyMessage(1);

}; ;