En subprocesos múltiples, ¿cuáles son los métodos y precauciones para que los subprocesos actualicen la interfaz de usuario del subproceso principal?
Android
UI multiproceso de trabajo de subprocesos de Android
Cuando un programa de Android comienza a ejecutarse, se iniciará un proceso por separado. De forma predeterminada, todas las actividades o servicios de este programa (Servicio y Actividad son solo dos de los Componentes proporcionados por Android, además del Proveedor de contenido y el Receptor de transmisión) se ejecutarán en este Proceso.
Un programa de Android tiene solo un proceso de forma predeterminada, pero puede haber muchos subprocesos en un proceso. Entre tantos subprocesos, hay un subproceso, al que llamamos subproceso UI. El hilo de la interfaz de usuario se crea cuando el programa de Android se está ejecutando. Es el hilo principal en un proceso. Es el principal responsable de controlar la visualización, actualización y control de la interacción de la interfaz de la interfaz de usuario. Al comienzo de la creación de programas de Android, un proceso presentaba un modelo de subproceso único y todas las tareas se ejecutaban en un solo subproceso. Por lo tanto, creemos que el tiempo dedicado a cada función ejecutada por UI Thread debería ser lo más corto posible. Otras tareas que requieren mucho tiempo (acceder a la red, descargar datos, consultar la base de datos, etc.) deben ser realizadas por subprocesos secundarios para evitar bloquear el subproceso principal.
Entonces, ¿cómo funciona UI Thread con otros Threads? Los métodos comúnmente utilizados son:
Cree un objeto Handler del hilo principal y utilícelo como Listener para permitir que el subproceso envíe mensajes a la cola de mensajes del hilo principal, a fin de activar el handlerMessage. () función del hilo principal y permite que el hilo principal conozca el estado del hilo secundario y actualice la interfaz de usuario en el hilo principal.
Por ejemplo, cuando el estado del hilo secundario cambia, necesitamos actualizar la interfaz de usuario. Si la interfaz de usuario se actualiza directamente en un subproceso secundario, generalmente se generará la siguiente excepción: 11-07 13:33:04.393: ERROR/JavaBinder(1029): android.view.ViewRoot$CalledFromWrongThreadException: solo el subproceso original que creó un la jerarquía de vistas puede tocar sus vistas.
Es decir, la interfaz de usuario no se puede actualizar en el hilo secundario. Para hacer esto, debemos notificar al hilo principal Ui Thread que actualice la interfaz a través del objeto Handler.
De la siguiente manera, primero cree un controlador para escuchar eventos de mensajes:
private final int UPDATE_UI = 1; controlador privado mHandler = new MainHandler(); clase privada MainHandler extiende el controlador {@ Anular public void handleMessage(Mensaje msg) {switch (msg.what) {case UPDATE_UI: {Log.i("TTSDeamon", "UPDATE_UI");showTextView.setText(editText.getText().toString());ShowAnimation() ;break;}default:break;}}}
o
Manejador privado mHandler = new Handler(){@Overridepublic void handleMessage(Mensaje msg) {switch (msg.what) {case UPDATE_UI: {Log.i("TTSDeamon", "UPDATE_UI");showTextView.setText(editText.getText().toString());ShowAnimation();break;}default:break;}}}
Cuando el estado del subproceso cambia, se envía un mensaje en el subproceso para notificar la actualización de la interfaz de usuario.
mHandler.sendEmptyMessageDelayed(UPDATE_UI, 0);
En nuestro programa, muchos métodos de devolución de llamada a veces no se ejecutan en el hilo principal, por lo que si se actualizan en el método de devolución de llamada si la interfaz de usuario falla , también puedes utilizar el método anterior.