Junior
O que é o Looper no Android?
sobes.tech IA
Resposta da IA
Looper é uma classe no Android que é usada para gerir o fluxo (Thread), tornando-o "Looping" (cíclico). Prepara o thread para processar mensagens da fila de mensagens (MessageQueue) até que seja explicitamente terminado.
Componentes principais do Looper:
- MessageQueue: Fila que armazena mensagens (Message) e tarefas (Runnable) para execução no thread do Looper. É uma estrutura segura para threads.
- Looper: Liga o thread à MessageQueue e extrai mensagens da fila de forma cíclica para processamento posterior.
- Handler: Objeto que coloca mensagens e tarefas na MessageQueue do Looper e as processa ao serem extraídas da fila. O Handler está ligado a um Looper específico.
Como funciona o Looper:
- Preparação: No thread, chama-se
Looper.prepare(). Isto cria uma nova instância de Looper e liga-a ao thread atual. Também é criada uma MessageQueue para este Looper. - Início do ciclo: Chama-se
Looper.loop(). Este método entra num ciclo infinito (até que o Looper seja terminado). No ciclo, o Looper verifica constantemente a MessageQueue em busca de novas mensagens. - Processamento de mensagens: Ao encontrar uma mensagem, o Looper a extrai e envia a um Handler que a adicionou à fila. O Handler executa a tarefa correspondente (por exemplo, chamar
handleMessage()ourun()para um Runnable). - Finalização: Para sair do ciclo e terminar o Looper, deve-se chamar
Looper.quit()ouLooper.quitSafely().
Uso típico do Looper:
- Criar threads de fundo que devem realizar tarefas assíncronas e receber mensagens do thread UI ou de outros threads.
- Uso em serviços (IntentService usa um Looper embutido).
- Trabalhar com HandlerThread (uma classe de thread que cria seu próprio Looper e MessageQueue).
Exemplo de criação de um thread com Looper e Handler:
// Criar e iniciar o thread
HandlerThread handlerThread = new HandlerThread("MyWorkerThread");
handlerThread.start();
// Obter o Looper do thread
Looper looper = handlerThread.getLooper();
// Criar um Handler ligado ao Looper
Handler handler = new Handler(looper) {
@Override
public void handleMessage(Message msg) {
// Processar mensagens no thread de trabalho
// msg.what contém o identificador da mensagem
// msg.obj ou msg.data podem conter dados
switch (msg.what) {
case 1:
// Processar mensagem do tipo 1
break;
case 2:
// Processar mensagem do tipo 2
break;
}
}
};
// Enviar mensagem ao thread de trabalho
handler.sendEmptyMessage(1);
// Ou executar um Runnable
handler.post(new Runnable() {
@Override
public void run() {
// Código a ser executado no thread de trabalho
}
});
// Quando o thread não for mais necessário, terminar o Looper e o thread
handlerThread.quitSafely();