Sobes.tech
Junior

Čo je to Looper v Androidu?

sobes.tech AI

Odpoveď od AI

Looper je trieda v Androidu, ktorá sa používa na riadenie vlákna (Thread), čím ho robí "Looping" (cyklickým). Pripraví vlákno na spracovanie správ z MessageQueue, kým nebude výslovne ukončené.

Hlavné komponenty Looper:

  • MessageQueue: fronta, ktorá uchováva správy (Message) a úlohy (Runnable) na vykonanie vo vlákne Looper. Je to štruktúra, ktorá je bezpečná pre vlákna.
  • Looper: spája vlákno s MessageQueue a cyklicky vyberá správy z fronty na ich ďalšie spracovanie.
  • Handler: objekt, ktorý umiestňuje správy a úlohy do MessageQueue Looper a spracováva ich pri ich vybratí z fronty. Handler je pripojený k určitému Looper.

Ako Looper funguje:

  1. Príprava: Vo vlákne sa volá Looper.prepare(). Toto vytvorí novú inštanciu Looper a spojí ju s aktuálnym vláknom. Taktiež sa vytvorí MessageQueue pre tento Looper.
  2. Spustenie cyklu: Volá sa Looper.loop(). Tento metóda vstupuje do nekonečného cyklu (kým nie je Looper ukončený). V cykle Looper neustále kontroluje MessageQueue na nové správy.
  3. Spracovanie správ: Nájduc správu, Looper ju vyberie a odošle Handleru, ktorý ju pridal do fronty. Handler vykoná príslušnú úlohu (napríklad zavolá metódu handleMessage() alebo run() pre Runnable).
  4. Ukončenie: Na ukončenie cyklu a ukončenie Looper je potrebné zavolať Looper.quit() alebo Looper.quitSafely().

Typické použitie Looper:

  • Vytváranie pozadíových vlákien, ktoré majú vykonávať úlohy asynchrónne a prijímať správy z UI vlákna alebo z iných vlákien.
  • Použitie v službách (IntentService používa zabudovaný Looper).
  • Práca s HandlerThread (špeciálna trieda vlákna, ktorá vytvára svoj Looper a MessageQueue).

Príklad vytvorenia vlákna s Looper a Handler:

// Vytvorenie vlákna a jeho spustenie
HandlerThread handlerThread = new HandlerThread("MyWorkerThread");
handlerThread.start();

// Získanie Looper z vlákna
Looper looper = handlerThread.getLooper();

// Vytvorenie Handlera pripojeného k Looper
Handler handler = new Handler(looper) {
    @Override
    public void handleMessage(Message msg) {
        // Spracovanie správ vo worker vlákne
        // msg.what obsahuje identifikátor správy
        // msg.obj alebo msg.data môžu obsahovať dáta
        switch (msg.what) {
            case 1:
                // Spracovať správu typu 1
                break;
            case 2:
                // Spracovať správu typu 2
                break;
        }
    }
};

// Odoslať správu do worker vlákna
handler.sendEmptyMessage(1);

// Alebo vykonať Runnable
handler.post(new Runnable() {
    @Override
    public void run() {
        // Kód, ktorý sa má vykonať vo worker vlákne
    }
});

// Keď vlákno už nie je potrebné, ukončíme Looper a vlákno
handlerThread.quitSafely();