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:
- 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. - 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. - 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()aleborun()pre Runnable). - Ukončenie: Na ukončenie cyklu a ukončenie Looper je potrebné zavolať
Looper.quit()aleboLooper.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();