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)
MessageQueuekuyruğundan alır ve uygunHandler'lara gönderir. - Looper:
Loopernesnesi, akışla ilişkilidir ve bu mesaj işleme döngüsünü yönetir. - Handler:
Handlernesnesi, bağlı olduğuMessageQueue'daMessageveRunnablenesnelerini 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)
}
}
}