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:
- 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. - 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. - 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 üçünrun()). - Bağlanma: Döngüdən çıxmaq və Looper-i bağlamaq üçün
Looper.quit()və yaLooper.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();