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:
- 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. - 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. - 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()saurun()pentru Runnable). - Închiderea: Pentru a ieși din ciclu și a închide Looper-ul, trebuie să se apeleze
Looper.quit()sauLooper.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();