Junior
¿Qué es Looper en Android?
sobes.tech AI
Respuesta de la IA
Looper es una clase en Android que se utiliza para gestionar el flujo (Thread), haciendo que sea "Looping" (cíclico). Prepara el hilo para procesar mensajes de la cola de mensajes (MessageQueue) hasta que se finalice explícitamente.
Componentes principales de Looper:
- MessageQueue: Cola que almacena mensajes (Message) y tareas (Runnable) para ejecutar en el hilo Looper. Es una estructura segura para hilos.
- Looper: Vincula el hilo con MessageQueue y extrae mensajes de la cola de forma cíclica para su posterior procesamiento.
- Handler: Objeto que coloca mensajes y tareas en la MessageQueue del Looper y los procesa al ser extraídos de la cola. Handler se vincula a un Looper específico.
Cómo funciona Looper:
- Preparación: En el hilo se llama a
Looper.prepare(). Esto crea una nueva instancia de Looper y la vincula con el hilo actual. También se crea una MessageQueue para este Looper. - Inicio del ciclo: Se llama a
Looper.loop(). Este método entra en un ciclo infinito (hasta que se finalice el Looper). En el ciclo, Looper verifica constantemente la MessageQueue en busca de nuevos mensajes. - Procesamiento de mensajes: Al encontrar un mensaje, Looper lo extrae y lo envía a un Handler que lo agregó a la cola. El Handler realiza la tarea correspondiente (por ejemplo, llamar a
handleMessage()orun()para un Runnable). - Finalización: Para salir del ciclo y finalizar el Looper, se debe llamar a
Looper.quit()oLooper.quitSafely().
Uso típico de Looper:
- Crear hilos de fondo que deben realizar tareas asíncronas y recibir mensajes desde el hilo UI o desde otros hilos.
- Uso en servicios (IntentService usa un Looper incorporado).
- Trabajar con HandlerThread (una clase de hilo que crea su propio Looper y MessageQueue).
Ejemplo de creación de un hilo con Looper y Handler:
// Crear y arrancar el hilo
HandlerThread handlerThread = new HandlerThread("MyWorkerThread");
handlerThread.start();
// Obtener el Looper del hilo
Looper looper = handlerThread.getLooper();
// Crear un Handler vinculado al Looper
Handler handler = new Handler(looper) {
@Override
public void handleMessage(Message msg) {
// Procesar mensajes en el hilo de trabajo
// msg.what contiene el identificador del mensaje
// msg.obj o msg.data pueden contener datos
switch (msg.what) {
case 1:
// Procesar mensaje de tipo 1
break;
case 2:
// Procesar mensaje de tipo 2
break;
}
}
};
// Enviar un mensaje al hilo de trabajo
handler.sendEmptyMessage(1);
// O ejecutar un Runnable
handler.post(new Runnable() {
@Override
public void run() {
// Código que se ejecuta en el hilo de trabajo
}
});
// Cuando ya no se necesita el hilo, finalizar el Looper y el hilo
handlerThread.quitSafely();