Junior
Android'da Looper nima?
sobes.tech AI
AIdan javob
Looper Android'da Thread'ni boshqarish uchun ishlatiladigan sinf bo'lib, uni "Looping" (aylanma) qilish uchun mo'ljallangan. U threadni MessageQueue (Xabarlar navbati) dan xabarlarni qayta ishlash uchun tayyorlaydi va aniq yakunlanmaguncha davom etadi.
Looper ning asosiy komponentlari:
- MessageQueue: Xabarlar (Message) va vazifalar (Runnable) saqlovchi navbat. Bu thread xavfsiz tuzilma.
- Looper: Threadni MessageQueue bilan bog'laydi va uni doimiy ravishda xabarlarni chiqarib, ularni qayta ishlash uchun oladi.
- Handler: Ob'ekt, u MessageQueue ga xabarlar va vazifalarni joylashtiradi va ularni chiqarib olgach, bajaradi. Handler ma'lum bir Looper bilan bog'langan.
Looper qanday ishlaydi:
- Tayyorlash: Thread ichida
Looper.prepare()chaqiriladi. Bu yangi Looper nusxasini yaratadi va uni joriy thread bilan bog'laydi. Bu Looper uchun MessageQueue ham yaratiladi. - Siklni boshlash:
Looper.loop()chaqiriladi. Bu metod abadiy siklga kiradi (Looper tugamaguncha). Sikl davomida Looper doimiy ravishda MessageQueue ni tekshiradi. - Xabarlarni qayta ishlash: Xabar topilganda, Looper uni chiqaradi va Handlerga yuboradi, u esa uni navbatga qo'shadi. Handler mos vazifani bajaradi (
handleMessage()yoki Runnable uchunrun()chaqiriladi). - Yakunlash: Sikldan chiqish va Looperni tugatish uchun
Looper.quit()yokiLooper.quitSafely()chaqiriladi.
Looper ning odatiy ishlatilishi:
- Orqa fon threadlarini yaratish, ular asinxron vazifalarni bajarishi va UI thread yoki boshqa threadlardan xabarlar olishi.
- Servislarda (IntentService ichki Looper bilan ishlaydi).
- HandlerThread bilan ishlash (o'zining Looper va MessageQueue ni yaratadigan maxsus thread klassi).
Looper va Handler bilan thread yaratish misoli:
// Threadni yaratish va ishga tushurish
HandlerThread handlerThread = new HandlerThread("MyWorkerThread");
handlerThread.start();
// Threaddan Looper ni olish
Looper looper = handlerThread.getLooper();
// Looper bilan bog'langan Handler yaratish
Handler handler = new Handler(looper) {
@Override
public void handleMessage(Message msg) {
// Ishchi threadda xabarlarni qayta ishlash
// msg.what xabar identifikatori
// msg.obj yoki msg.data ma'lumotlarni o'z ichiga olishi mumkin
switch (msg.what) {
case 1:
// 1-turdagi xabarni qayta ishlash
break;
case 2:
// 2-turdagi xabarni qayta ishlash
break;
}
}
};
// Ishchi threadga xabar yuborish
handler.sendEmptyMessage(1);
// Yoki Runnable bajarish
handler.post(new Runnable() {
@Override
public void run() {
// Ishchi threadda bajariladigan kod
}
});
// Thread endi kerak bo'lmasa, Looper va threadni yakunlash
handlerThread.quitSafely();