Junior
Android'de Looper nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Looper, Android'de Thread akışını yönetmek ve onu "Looping" (döngüsel) hale getirmek için kullanılan bir sınıftır. Thread'i mesaj kuyruğundan (MessageQueue) mesajları işleyecek şekilde hazırlar ve açıkça sonlandırılana kadar devam eder.
Looper'ın temel bileşenleri:
- MessageQueue: Mesajlar (Message) ve görevler (Runnable) içeren ve Looper thread'inde yürütülecek olan kuyruğu tutar. Çok iş parçacıklı güvenlidir.
- Looper: Thread ile MessageQueue'yu bağlar ve mesajları döngüsel olarak kuyruğundan alır.
- Handler: Mesajları ve görevleri MessageQueue'ya ekleyen ve kuyruktan çıkarıldıklarında işleyen nesnedir. Belirli bir Looper'a bağlıdır.
Looper nasıl çalışır:
- Hazırlık: Thread içinde
Looper.prepare()çağrılır. Bu, yeni bir Looper örneği oluşturur ve mevcut thread ile ilişkilendirir. Ayrıca, bu Looper için bir MessageQueue oluşturulur. - Döngü başlatma:
Looper.loop()çağrılır. Bu, sonsuz bir döngüye girer (Looper sonlandırılana kadar). Döngüde, Looper sürekli olarak MessageQueue'da yeni mesajlar olup olmadığını kontrol eder. - Mesajların işlenmesi: Bir mesaj bulunduğunda, Looper onu çıkarır ve MessageQueue'ya ekleyen Handler'a gönderir. Handler, ilgili görevi gerçekleştirir (örneğin,
handleMessage()veya Runnable içinrun()çağırmak). - Sonlandırma: Döngüden çıkmak ve Looper'ı sonlandırmak için
Looper.quit()veyaLooper.quitSafely()çağrılır.
Looper'ın tipik kullanımı:
- Arka plan thread'leri oluşturarak asenkron görevler yapmak ve UI thread'inden veya diğer thread'lerden mesaj almak.
- Servislerde kullanmak (IntentService yerleşik bir Looper kullanır).
- HandlerThread ile çalışmak (kendi Looper ve MessageQueue'sunu oluşturan özel bir thread sınıfı).
Looper ve Handler ile thread oluşturma örneği:
// Thread oluştur ve başlat
HandlerThread handlerThread = new HandlerThread("MyWorkerThread");
handlerThread.start();
// Thread'ten Looper al
Looper looper = handlerThread.getLooper();
// Looper'a bağlı Handler oluştur
Handler handler = new Handler(looper) {
@Override
public void handleMessage(Message msg) {
// İşçi thread'de mesajları işle
// msg.what mesajın kimliğini içerir
// msg.obj veya msg.data verileri içerebilir
switch (msg.what) {
case 1:
// Tip 1 mesajını işle
break;
case 2:
// Tip 2 mesajını işle
break;
}
}
};
// İşçi thread'e mesaj gönder
handler.sendEmptyMessage(1);
// Veya Runnable çalıştır
handler.post(new Runnable() {
@Override
public void run() {
// İşçi thread'de çalıştırılacak kod
}
});
// Thread artık gerekmediğinde Looper ve thread'i sonlandır
handlerThread.quitSafely();