Sobes.tech
Junior

Android-də Looper nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Looper Android-də Thread-i idarə etmək üçün istifadə olunan sinfdır və onu "Looping" (dairəvi) etmək üçün nəzərdə tutulmuşdur. Bu, thread-i MessageQueue-dən (Mesajlar Növbəsi) mesajları işləməyə hazırlayır və açıq şəkildə bağlanana qədər davam edir.

Looper-ın əsas komponentləri:

  • MessageQueue: Thread-də icra olunacaq mesajlar (Message) və tapşırıqlar (Runnable) saxlayan növbə. Bu, çox threadli təhlükəsiz strukturdur.
  • Looper: Thread-i MessageQueue ilə əlaqələndirir və mesajları dövr edən şəkildə çıxarır.
  • Handler: Ob'ekt, mesajları və tapşırıqları MessageQueue-ə yerləşdirir və çıxarılarkən işləyir. Handler müəyyən bir Looper-ə bağlıdır.

Looper necə işləyir:

  1. Hazırlıq: Thread-də Looper.prepare() çağırılır. Bu, yeni Looper nümunəsi yaradır və onu cari thread-ə bağlayır. Bu Looper üçün MessageQueue də yaradılır.
  2. Döngünün başlaması: Looper.loop() çağırılır. Bu, sonsuz döngüyə daxil olur (Looper bağlanana qədər). Döngüdə, Looper daim MessageQueue-də yeni mesajlar axtarır.
  3. Mesajların işlənməsi: Mesaj tapıldıqda, Looper onu çıxarır və MessageQueue-ə əlavə edən Handler-ə göndərir. Handler müvafiq tapşırığı yerinə yetirir (handleMessage() və ya Runnable üçün run()).
  4. Bağlanma: Döngüdən çıxmaq və Looper-i bağlamaq üçün Looper.quit() və ya Looper.quitSafely() çağırılır.

Looper-ın tipik istifadəsi:

  • Arxa plan thread-lər yaratmaq, asinxron tapşırıqları yerinə yetirmək və UI thread və ya digər thread-lərdən mesajlar almaq.
  • Servislərdə istifadə (IntentService daxili Looper istifadə edir).
  • HandlerThread ilə işləmək (öz Looper və MessageQueue-ni yaradan xüsusi thread sinfi).

Looper və Handler ilə thread nümunəsi:

// Thread yaradıb işə salırıq
HandlerThread handlerThread = new HandlerThread("MyWorkerThread");
handlerThread.start();

// Thread-dən Looper alınır
Looper looper = handlerThread.getLooper();

// Looper-ə bağlı Handler yaradılır
Handler handler = new Handler(looper) {
    @Override
    public void handleMessage(Message msg) {
        // İşçi thread-də mesajların işlənməsi
        // msg.what mesajın identifikatorunu saxlayır
        // msg.obj və ya msg.data məlumatlar saxlaya bilər
        switch (msg.what) {
            case 1:
                // 1 növ mesajın işlənməsi
                break;
            case 2:
                // 2 növ mesajın işlənməsi
                break;
        }
    }
};

// İşçi thread-ə mesaj göndərilir
handler.sendEmptyMessage(1);

// Və ya Runnable icra edilir
handler.post(new Runnable() {
    @Override
    public void run() {
        // İşçi thread-də icra olunan kod
    }
});

// Thread artıq lazım deyilsə, Looper və thread bağlanır
handlerThread.quitSafely();