Sobes.tech
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:

  1. Tayyorlash: Thread ichida Looper.prepare() chaqiriladi. Bu yangi Looper nusxasini yaratadi va uni joriy thread bilan bog'laydi. Bu Looper uchun MessageQueue ham yaratiladi.
  2. Siklni boshlash: Looper.loop() chaqiriladi. Bu metod abadiy siklga kiradi (Looper tugamaguncha). Sikl davomida Looper doimiy ravishda MessageQueue ni tekshiradi.
  3. Xabarlarni qayta ishlash: Xabar topilganda, Looper uni chiqaradi va Handlerga yuboradi, u esa uni navbatga qo'shadi. Handler mos vazifani bajaradi (handleMessage() yoki Runnable uchun run() chaqiriladi).
  4. Yakunlash: Sikldan chiqish va Looperni tugatish uchun Looper.quit() yoki Looper.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();