Sobes.tech
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:

  1. Подготовка: В нишката се извиква Looper.prepare(). Това създава нов екземпляр на Looper и го свързва с текущата нишка. Създава се също MessageQueue за този Looper.
  2. Започване на цикъла: Извиква се Looper.loop(). Този метод влиза в безкраен цикъл (докато Looper не бъде завършен). В цикъла Looper постоянно проверява MessageQueue за нови съобщения.
  3. Обработка на съобщения: Намерено съобщение, Looper го извлича и го изпраща на Handler, който го е добавил към опашката. Handler изпълнява съответната задача (например, извиква метода handleMessage() или run() за Runnable).
  4. Завършване: За изход от цикъла и завършване на 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();