Junior
Какво е Looper в Android?
sobes.tech AI
Отговор от AI
Looper е клас в Android, който се използва за управление на нишка (Thread), като я прави "Looping" (циклична). Той подготвя нишката за обработка на съобщения от MessageQueue, докато не бъде явно завършена.
Основните компоненти на Looper:
- MessageQueue: Опашка, която съхранява съобщения (Message) и задачи (Runnable) за изпълнение в нишката на Looper. Това е структура, безопасна за нишки.
- Looper: Свързва нишката с MessageQueue и циклично извлича съобщения от опашката за по-нататъшна обработка.
- Handler: Обект, който поставя съобщения и задачи в MessageQueue на Looper и ги обработва при извличане от опашката. Handler е свързан с определен Looper.
Как работи Looper:
- Подготовка: В нишката се извиква
Looper.prepare(). Това създава нов екземпляр на Looper и го свързва с текущата нишка. Създава се също MessageQueue за този Looper. - Започване на цикъла: Извиква се
Looper.loop(). Този метод влиза в безкраен цикъл (докато Looper не бъде завършен). В цикъла Looper постоянно проверява MessageQueue за нови съобщения. - Обработка на съобщения: Намерено съобщение, Looper го извлича и го изпраща на Handler, който го е добавил към опашката. Handler изпълнява съответната задача (например, извиква метода
handleMessage()илиrun()за Runnable). - Завършване: За изход от цикъла и завършване на Looper е необходимо да се извика
Looper.quit()илиLooper.quitSafely().
Типично използване на Looper:
- Създаване на фонови нишки, които трябва да изпълняват задачи асинхронно и да получават съобщения от UI нишката или други нишки.
- Използване в услуги (IntentService използва вградения Looper).
- Работа с HandlerThread (специален клас за нишка, който създава свой Looper и MessageQueue).
Пример за създаване на нишка с Looper и Handler:
// Създаване на нишка и стартирането й
HandlerThread handlerThread = new HandlerThread("MyWorkerThread");
handlerThread.start();
// Получаване на Looper от нишката
Looper looper = handlerThread.getLooper();
// Създаване на Handler, свързан с Looper
Handler handler = new Handler(looper) {
@Override
public void handleMessage(Message msg) {
// Обработка на съобщения в работната нишка
// msg.what съдържа идентификатора на съобщението
// msg.obj или msg.data могат да съдържат данни
switch (msg.what) {
case 1:
// Обработка на съобщение тип 1
break;
case 2:
// Обработка на съобщение тип 2
break;
}
}
};
// Изпращане на съобщение към работната нишка
handler.sendEmptyMessage(1);
// Или изпълнение на Runnable
handler.post(new Runnable() {
@Override
public void run() {
// Код, изпълняван в работната нишка
}
});
// Когато вече не е необходима, спираме Looper и нишката
handlerThread.quitSafely();