Android usa Handler para permitir que los subprocesos secundarios actualicen la interfaz de usuario
En proyectos de Android, a menudo encontramos este tipo de problemas. Después de completar operaciones que requieren mucho tiempo en subprocesos secundarios, necesitamos actualizar la interfaz de usuario. Aquí hay un resumen de los métodos de actualización basados en algunos proyectos que he experimentado.
1. Introducción
Primero, echemos un vistazo al mecanismo de mensajes en Android:
Términos profesionales:
Mensaje: mensaje , que contiene El ID del mensaje, el objeto de procesamiento del mensaje y los datos procesados son puestos en cola uniformemente por MessageQueue y finalmente procesados por Handler. ?
Handler: Handler, responsable de enviar y procesar el Mensaje. Cuando utilice Handler, debe implementar el método handleMessage (Mensaje de mensaje) para procesar un mensaje específico, como actualizar la interfaz de usuario, etc. ?
MessageQueue: cola de mensajes, utilizada para almacenar mensajes enviados por Handler y ejecutados de acuerdo con reglas FIFO. Por supuesto, almacenar el mensaje no es guardarlo en sí, sino concatenar el mensaje en una lista vinculada y esperar a que Looper lo extraiga. ?
Looper: bomba de mensajes, que extrae continuamente mensajes de MessageQueue para su ejecución. Por lo tanto, un MessageQueue requiere un Looper. ?
Subproceso: Subproceso, responsable de programar todo el bucle de mensajes, es decir, el lugar de ejecución del bucle de mensajes.
?
2. Método
1. ¿Usar Handler
(1)? Definir Handler en el hilo principal:?
Código Java :
[java]?vista simple?copia
Handler?mHandler?=?new?Handler()?{
@Override
public?void?handleMessage(¿Mensaje?msg)?{
super.handleMessage(msg);
¿cambiar?(msg.what)?{
case?0:
//Completar la actualización de la interfaz principal, ¿obtener los datos?
¿Cadena? datos? =?(String)msg.obj;
updateWeather();
textView.setText(datos);
romper;
predeterminado:
descanso;
}
}
}
(2) Sub- El hilo envía un mensaje, notifica al controlador para completar la actualización de la interfaz de usuario:?
código Java:
privado?void?updateWeather()?{
nuevo?Thread (new?Runnable() {
@Override
public?void?run()?{
//Consume mucho tiempo Una vez completada la operación, envíe un mensaje al controlador para completar la actualización de la interfaz de usuario;
mHandler.sendEmptyMessage(0);
< span?style="color:#33cc00;" >//Si es necesario transferir datos, utilice el siguiente método;?
Message?msg?=new?Message() ;
msg.obj?=?"data ";//Puede ser un tipo básico, un objeto, una Lista, un mapa, etc. .;??
mHandler.sendMessage( msg);
}
}).start();
}
Nota: El objeto Handler debe definirse en el hilo principal. Si varias clases se llaman entre sí directamente, no es muy conveniente pasar el objeto de contenido o llamar a través de la interfaz.
2. ¿Utilizar el método runOnUiThread del objeto Actividad para actualizar?
Actualizar la interfaz de usuario a través del método runOnUiThread() en el hilo secundario:?
java código:
p>
¿nuevo?Thread()?{
public?void?run()?{
// Aquí hay una operación que requiere mucho tiempo; actualice la interfaz de usuario una vez finalizada;
runOnUiThread(new?Runnable(){
@ Anular
public?void? run()?{
//Actualizar interfaz de usuario
imageView.setImageBitmap(mapa de bits);
}
});
}
}.start(); p>
Si está en una clase sin contexto, la llamada se puede implementar pasando el contexto:
código java:
¿Actividad?actividad?=?(Actividad)? imageView.getContext();
actividad.runOnUiThread (new?Runnable()?{ ?
@Override
public?void?run()?{
imageView.setImageBitmap(bitmap);
p>}
});
Nota: Este método es más flexible de usar , pero si Thread se define en otro lugar, es necesario pasar el objeto Actividad.
3.
View.post(Runnable r)?
código java:
imageView.post(new?Runnable() {
@Override
public?void?run()?{
imageView.setImageBitmap(mapa de bits);
} p>
});
Este método es más simple, pero requiere pasar la Vista para actualizarse.
Resumen: las actualizaciones de la interfaz de usuario deben completarse en el hilo principal, por lo que, independientemente del método anterior, el mensaje para actualizar la interfaz de usuario se envía al objeto de mensaje del hilo principal, lo que permite que el hilo principal lo maneje. .