Sobes.tech
Junior

Ce este Looper în Android?

sobes.tech AI

Răspuns de la AI

Looper este o clasă în Android utilizată pentru gestionarea fluxului (Thread), făcându-l "Looping" (circular). Pregătește firul pentru procesarea mesajelor din coada de mesaje (MessageQueue) până când este închis în mod explicit.

Componentele principale ale Looper:

  • MessageQueue: Coada care stochează mesajele (Message) și sarcinile (Runnable) pentru execuție în firul Looper. Este o structură sigură pentru fire.
  • Looper: Leagă firul de MessageQueue și extrage mesajele din coadă în mod ciclic pentru procesare ulterioară.
  • Handler: Obiect care plasează mesajele și sarcinile în MessageQueue-ul Looper și le procesează la extragere. Handler este legat de un Looper specific.

Cum funcționează Looper:

  1. Pregătire: În fir, se apelează Looper.prepare(). Acest lucru creează o instanță nouă de Looper și o leagă de firul curent. De asemenea, se creează o MessageQueue pentru acest Looper.
  2. Pornirea ciclului: Se apelează Looper.loop(). Această metodă intră într-un ciclu infinit (până când Looper-ul este închis). În ciclu, Looper verifică constant MessageQueue pentru mesaje noi.
  3. Procesarea mesajelor: Când găsește un mesaj, Looper îl extrage și îl trimite către un Handler care l-a adăugat în coadă. Handler-ul execută sarcina corespunzătoare (de exemplu, apelarea handleMessage() sau run() pentru Runnable).
  4. Închiderea: Pentru a ieși din ciclu și a închide Looper-ul, trebuie să se apeleze Looper.quit() sau Looper.quitSafely().

Utilizare tipică a Looper:

  • Crearea de fire de fundal care trebuie să execute sarcini asincron și să primească mesaje de la firul UI sau din alte fire.
  • Utilizarea în servicii (IntentService folosește un Looper încorporat).
  • Lucrul cu HandlerThread (o clasă specială de fir care creează propriul Looper și MessageQueue).

Exemplu de creare a unui fir cu Looper și Handler:

// Creăm și pornim firul
HandlerThread handlerThread = new HandlerThread("MyWorkerThread");
handlerThread.start();

// Obținem Looper-ul din fir
Looper looper = handlerThread.getLooper();

// Creăm un Handler legat de Looper
Handler handler = new Handler(looper) {
    @Override
    public void handleMessage(Message msg) {
        // Procesarea mesajelor în firul de lucru
        // msg.what conține identificatorul mesajului
        // msg.obj sau msg.data pot conține date
        switch (msg.what) {
            case 1:
                // Procesare mesaj de tip 1
                break;
            case 2:
                // Procesare mesaj de tip 2
                break;
        }
    }
};

// Trimiteți un mesaj în firul de lucru
handler.sendEmptyMessage(1);

// Sau executați un Runnable
handler.post(new Runnable() {
    @Override
    public void run() {
        // Cod executat în firul de lucru
    }
});

// Când firul nu mai este necesar, închideți Looper-ul și firul
handlerThread.quitSafely();