Junior
Kas yra Looper Android?
sobes.tech AI
Atsakymas iš AI
Looper yra klasė Android, kuri naudojama srauto (Thread) valdymui ir padaro jį "Looping" (ciklinį). Ji paruošia srautą apdoroti žinutes iš MessageQueue iki tol, kol jis bus aiškiai užbaigtas.
Pagrindiniai Looper komponentai:
- MessageQueue: eilė, sauganti žinutes (Message) ir užduotis (Runnable), skirtas vykdyti sraute. Tai yra saugi struktūra kelių srautų atžvilgiu.
- Looper: jungia srautą su MessageQueue ir cikliškai ištraukia žinutes iš eilės jų tolesniam apdorojimui.
- Handler: objektas, kuris įdeda žinutes ir užduotis į MessageQueue ir jas apdoroja, kai jos ištraukiamos iš eilės. Handler yra susietas su konkrečiu Looper.
Kaip veikia Looper:
- Paruošimas: Sraute kviečiama
Looper.prepare(). Tai sukuria naują Looper egzempliorių ir susieja jį su dabartiniu srautu. Taip pat sukuriama MessageQueue šiam Looper. - Ciklo paleidimas: Kviečiama
Looper.loop(). Šis metodas įeina į begalinį ciklą (kol Looper nėra užbaigtas). Cikle Looper nuolat tikrina MessageQueue dėl naujų žinučių. - Žinučių apdorojimas: Suradęs žinutę, Looper ją ištraukia ir siunčia Handler, kuris ją pridėjo į eilę. Handler atlieka atitinkamą užduotį (pavyzdžiui, iškviečia
handleMessage()arbarun()Runnable).n - Užbaigimas: Norint išeiti iš ciklo ir užbaigti Looper, reikia iškviesti
Looper.quit()arbaLooper.quitSafely().
Tipinis Looper naudojimas:
- Kurti foninius srautus, kurie turi vykdyti užduotis asinchroniškai ir gauti žinutes iš UI srauto arba kitų srautų.
- Naudoti paslaugose (IntentService naudoja įmontuotą Looper).
- Dirbti su HandlerThread (specialus srauto klasė, kuri sukuria savo Looper ir MessageQueue).
Pavyzdys, kaip sukurti srautą su Looper ir Handler:
// Sukurti srautą ir jį paleisti
HandlerThread handlerThread = new HandlerThread("MyWorkerThread");
handlerThread.start();
// Gauti Looper iš srauto
Looper looper = handlerThread.getLooper();
// Sukurti Handler, susietą su Looper
Handler handler = new Handler(looper) {
@Override
public void handleMessage(Message msg) {
// Žinučių apdorojimas darbo sraute
// msg.what turi žinutės identifikatorių
// msg.obj arba msg.data gali turėti duomenis
switch (msg.what) {
case 1:
// Apdoroti žinutę tipo 1
break;
case 2:
// Apdoroti žinutę tipo 2
break;
}
}
};
// Siųsti žinutę į darbo srautą
handler.sendEmptyMessage(1);
// Arba vykdyti Runnable
handler.post(new Runnable() {
@Override
public void run() {
// Kodas, vykdomas darbo sraute
}
});
// Kai srautas nebebus reikalingas, užbaigti Looper ir srautą
handlerThread.quitSafely();