Junior
Mis on Looper Androidis?
sobes.tech AI
Vastus AI-lt
Looper on Androidi klass, mis võimaldab juhtida niiti (Thread) ja muuta selle "Looping" (tsükliliseks). See valmistab niidi ette sõnumite (Message) järjekorrast (MessageQueue) töötlemiseks, kuni see on selgelt lõpetatud.
Looperi peamised komponendid:
- MessageQueue: järjekord, mis hoiab sõnumeid (Message) ja ülesandeid (Runnable), mida tuleb niidis töödelda. See on niit-turvaline struktuur.
- Looper: ühendab niidi MessageQueue-ga ja tsükliliselt võtab sõnumeid välja, et neid edasi töödelda.
- Handler: objekt, mis asetab sõnumeid ja ülesandeid MessageQueue-sse ning töötab nende välja võtmise ajal. Handler on seotud konkreetse Looperiga.
Kuidas Looper töötab:
- Valmistamine: Niidis kutsutakse
Looper.prepare(). See loob uue Looper eksemplari ja seob selle jooksva niidiga. Samuti luuakse MessageQueue selle Looperi jaoks. - Tsükli käivitamine: Kutsutakse
Looper.loop(). See meetod siseneb lõpmatusse tsüklisse (kuni Looper lõpetatakse). Tsükli jooksul kontrollib Looper pidevalt MessageQueue-d uute sõnumite jaoks. - Sõnumite töötlemine: Kui sõnum leitakse, võtab Looper selle välja ja saadab Handlerile, kes on selle lisanud järjekorda. Handler täidab vastava ülesande (näiteks kutsub välja
handleMessage()võirun()Runnable jaoks). - Lõpetamine: Tsüklist väljumiseks ja Looperi lõpetamiseks tuleb kutsuda
Looper.quit()võiLooper.quitSafely().
Looperi tüüpiline kasutus:
- Taustapõhised niidid, mis peavad täitma ülesandeid asünkroonselt ja saama sõnumeid UI-niidist või teistest niitidest.
- Kasutamine teenustes (näiteks IntentService kasutab sisseehitatud Looperit).
- Töötamine HandlerThread-iga (eriline niidi klass, mis loob oma Looperi ja MessageQueue).
Näide Looperi ja Handleri loomise kohta:
// Niidi loomine ja selle käivitamine
HandlerThread handlerThread = new HandlerThread("MyWorkerThread");
handlerThread.start();
// Looper saamine niidist
Looper looper = handlerThread.getLooper();
// Handleri loomine, mis on seotud Looperiga
Handler handler = new Handler(looper) {
@Override
public void handleMessage(Message msg) {
// Töötamine sõnumitega tööniidis
// msg.what sisaldab sõnumi identifikaatorit
// msg.obj või msg.data võivad sisaldada andmeid
switch (msg.what) {
case 1:
// Töötada sõnumit tüüpi 1
break;
case 2:
// Töötada sõnumit tüüpi 2
break;
}
}
};
// Sõnumi saatmine tööniidile
handler.sendEmptyMessage(1);
// Või Runnable'i käivitamine
handler.post(new Runnable() {
@Override
public void run() {
// Kood, mis täidetakse tööniidis
}
});
// Kui niit enam ei ole vajalik, lõpetame Looperi ja niidi
handlerThread.quitSafely();