Sobes.tech
Junior

Android'de ana akış nasıl çalışır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Android'de Ana Akış (Main Thread), aynı zamanda UI Thread olarak da bilinen, tek akıştır ve:

  • Kullanıcı arayüzü olaylarını (buton tıklamaları, kaydırma) işler.
  • Ekrandaki öğeleri çizer.
  • Bileşenlerin yaşam döngüsü kodunu çalıştırır (Activity, Fragment).

Uygulama başlatıldığında, Android ana akışı oluşturur. Tüm kullanıcı arayüzü bileşenleri yalnızca bu akışta oluşturulur ve güncellenir.

Anahtar kavramlar:

  • Event Loop: Ana akış, sürekli mesajlar (UI olayları, çizim görevleri) MessageQueue kuyruğundan alır ve uygun Handler'lara gönderir.
  • Looper: Looper nesnesi, akışla ilişkilidir ve bu mesaj işleme döngüsünü yönetir.
  • Handler: Handler nesnesi, bağlı olduğu MessageQueue'da Message ve Runnable nesnelerini göndermeye ve işlemeye olanak tanır. Genellikle, UI ile diğer akışlar arasında iletişim için ana akışta oluşturulur.

Sorunlar:

  • ANR (Application Not Responding): Uzun süren işlemler ana akışta çalıştırılırsa, bu akış kilitlenir, UI olaylarını işlemez ve ekranı çizmeyi durdurur. Bu, uygulamanın donmasına ve ANR iletişim kutusunun görünmesine neden olur. Tipik olarak, UI ile çalışırken ANR'yi tetikleyen süre 5 saniyedir.

Çözüm:

  • Uzun süren işlemleri (ağ istekleri, veritabanı işlemleri, karmaşık hesaplamalar) arka plan akışlarında gerçekleştirin.
  • UI'yi arka plan akışlarından güncellemek için iletişim mekanizmaları kullanın (Handler, AsyncTask, Coroutines).
// Arka plan akışından UI'yi güncellemek için Handler kullanımı örneği
Handler mainHandler = new Handler(Looper.getMainLooper());

new Thread(new Runnable() {
    @Override
    public void run() {
        // Uzun işlemi arka plan akışında gerçekleştir
        // ...

        // UI güncelleme görevi gönder
        mainHandler.post(new Runnable() {
            @Override
            public void run() {
                // Ana akışta UI'yi güncelle
                // ...
            }
        });
    }
}).start();
// Arka plan akışından UI'yi güncellemek için coroutines kullanımı örneği
import kotlinx.coroutines.*

fun fetchDataAndUpdateUI() {
    CoroutineScope(Dispatchers.IO).launch {
        // Uzun işlemi arka plan akışında gerçekleştir
        val data = fetchDataFromServer()

        // UI'yi güncellemek için ana akışa geç
        withContext(Dispatchers.Main) {
            updateUI(data)
        }
    }
}