La Red de Conocimientos Pedagógicos - Currículum vitae - ¿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: la actividad en ejecución de un programa con ciertas funciones independientes en un determinado conjunto de datos. El proceso es una unidad independiente del sistema para la asignación y programación de recursos.

Subproceso: Es la entidad de un proceso, la unidad básica de programación y despacho de la CPU, y una unidad básica que es más pequeña que un proceso y puede ejecutarse de forma independiente. El subproceso en sí básicamente no tiene recursos del sistema, solo algunos recursos esenciales (como un contador de programa, un conjunto de registros y una pila), pero puede compartir todos los recursos que posee el proceso con otros subprocesos que pertenecen al mismo proceso.

Diferencia:

(1), un programa tiene al menos un proceso y un proceso tiene al menos un hilo;

(2) La escala de división El número de subprocesos es menor que el de los procesos. La escala de división hace que la concurrencia de programas multiproceso sea alta;

(3) El proceso tiene una unidad de memoria independiente durante la ejecución y varios subprocesos * * * comparten memoria , pero no hay una dirección separada entre el espacio de subprocesos. La muerte de un hilo equivale a la muerte de todo el proceso.

-

Primero, el modelo de comunicación entre procesos de Android

1. Bundling

Dado que las actividades, los servicios y los receptores pueden ser todos los datos. transferidos a través de paquetes que transportan intenciones, por lo que podemos enviar datos que transportan paquetes en un proceso a componentes de otro proceso a través de intenciones.

Desventaja: los tipos de datos no admitidos por Bundle no se pueden transmitir.

2. Proveedor de contenido

ContentProvider es uno de los cuatro componentes principales de Android. Almacena datos en forma de formularios y los proporciona al mundo exterior, es decir, el contenido. El proveedor puede acceder a otras aplicaciones a través de datos 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 al crear. Los métodos para agregar, eliminar, verificar y modificar son consultar y modificar datos. getType devuelve una cadena que indica el tipo de solicitud Uri. Una vez registrado, el Uri especificado se puede solicitar utilizando ContentResolver.

3. Archivo de prueba

Dos procesos pueden acceder al mismo archivo para intercambiar datos. No sólo podemos guardar archivos de texto, también podemos guardar objetos en un archivo y restaurarlos desde otro archivo. Cabe señalar que pueden surgir problemas de simultaneidad al leer/escribir simultáneamente.

4. Transmisión

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

5.Modo AIDL

Al igual que los proveedores de contenido, los servicios también pueden acceder a datos en otras aplicaciones. El proveedor de contenido devuelve un objeto de cursor y el servicio devuelve un objeto Java. Este servicio de comunicación entre procesos se denomina servicio AIDL.

AIDL define la interfaz pública del servidor y la proporciona para las llamadas de los clientes. 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 la entrega de mensajes.

6. Messenger; corresponsal

El mensajero está implementado 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 Messenger y devuelve la carpeta de Messenger durante onBind.

Ambas partes utilizan Messenger para enviar datos y Handler para procesar datos. Messenger depende de controladores para manejar los datos, por lo que es en serie. Es decir, cuando un controlador recibe varios mensajes, los pone en cola para procesarlos en secuencia.

7. Socket (alimentación)

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

2. Métodos de comunicación entre subprocesos de Android

En términos generales, la comunicación entre subprocesos se refiere principalmente a la comunicación entre el subproceso principal (también llamado subproceso de UI) y los subprocesos secundarios.

Hay dos formas principales:

1. Mecanismo de tarea asincrónica

AsyncTask, tarea asincrónica, es decir, cuando se ejecuta el subproceso de la interfaz de usuario, se pueden realizar algunas operaciones asincrónicas en el background; AsyncTask puede utilizar fácil y correctamente el subproceso de la interfaz de usuario de forma explícita, lo que permite que las operaciones y los resultados en segundo plano se envíen al subproceso de la interfaz de usuario sin el uso explícito de subprocesos de trabajo o mecanismos de controlador. Sin embargo, AsyncTask sólo se puede utilizar para operaciones de corta duración (operaciones que deberían finalizar en unos segundos como máximo). Si necesita ejecutarse en segundo plano durante mucho tiempo, AsyncTask no es adecuado y solo se puede implementar utilizando otras API proporcionadas por Java.

2. Mecanismo del procesador

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 y 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 de mensaje en procesos posteriores y permitir que otros subprocesos completen una acción (como enviar un objeto de mensaje a través del objeto Handler en el subproceso de trabajo para permitir que el subproceso de la interfaz de usuario actualice la interfaz de usuario, y luego el El hilo de la interfaz de usuario obtendrá el objeto MessageQueue Message (la eliminación del objeto Message se completa mediante su objeto Looper asociado) y responderá en consecuencia

En tercer lugar, la comunicación entre los dos subprocesos de Android

Entrevista. el entrevistador puede preguntar sobre el método de comunicación entre los subprocesos de Android. Debido a que la mayoría de los programadores se centran principalmente en la comunicación entre el subproceso principal de Android y los subprocesos, esta pregunta es fácil de forzar. el hilo principal y el hilo secundario pueden enviar el mensaje en el hilo secundario al looper en el hilo principal a través del controlador en el hilo principal, o el controlador en el hilo principal envía el ejecutable al looper a través de la publicación, pero el El looper está predeterminado. Existe en el hilo principal y no hay Looper en el hilo secundario. ¿Qué debo hacer? De hecho, el principio es muy simple. Vincular el looper al hilo secundario y crear un controlador. enviando el mensaje a través de este controlador. Comunicación entre subprocesos secundarios.

Hay dos formas de crear un controlador para subprocesos secundarios:

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 Solo hay un objeto Looper para un Thead.

Handler handler = new Handler(){

@override

public void handleMessage(Message msg) {.

Toast .crear texto (getApplicationContext(), "handleMessage", Toast. length_long

}

}; .senemptymessage(1) ;

looper . loop(); // Recorre continuamente si hay mensajes en MessageQueue.

};

}).start();

-

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

new thread(new Runnable() {

public void run(){

handler handler = new handler(looper.getmainlooper( )) {//¡La diferencia está aquí!

@Override

Public void handleMessage(Message msg) {

Toast. , " handleMessage ", Toast. length_long);

}

};

senemptymessage(1);

};

}).start();