Örnek sorular
Kt Kotlin Coroutines FlowZorluk 1
Kotlin'de bir fonksiyonu suspend ile işaretlemek gerçekte ne anlama gelir?
- aFonksiyonun, çağıranı bloklamadan duraklamasına izin verir.✓
- bFonksiyonu otomatik olarak bir arka plan thread'inde çalıştırır.
- cFonksiyonun dönüş değerini nullable yapar.
- dFonksiyonu diğer koddan önce senkron çalışmaya zorlar.
Açıklama:suspend bir derleyici işaretidir: fonksiyonun başka suspend fonksiyonları çağırmasına ve coroutine altyapısı tarafından duraklatılıp devam ettirilmesine izin verir. Hangi thread'de çalışacağını söylemez — bunu dispatcher belirler.
Kt Kotlin Coroutines FlowZorluk 1
Bir suspend fonksiyon neden doğrudan sıradan (suspend olmayan) koddan çağrılamaz?
- aÇünkü suspend fonksiyonlar senkron çağrıldığında her zaman exception fırlatır.
- bÇünkü duraklatma, duraklat/devam mekanizmasını yönetecek bir coroutine bağlamı gerektirir.✓
- cÇünkü Kotlin derleyicisi suspend fonksiyonları release build'lerden fiziksel olarak kaldırır.
- dÇünkü suspend fonksiyonlar sadece
object bildirimleri içinde var olabilir.
Açıklama:Bir suspend fonksiyonun gerçekten duraklayıp devam edebilmesi için bir Continuation ve coroutine scope'a ihtiyacı vardır; sıradan kodda böyle bir mekanizma yoktur, bu yüzden derleyici çağıranın bir coroutine builder'ı (launch, runBlocking vb.) ya da başka bir suspend fonksiyon olmasını ister.
Kt Kotlin Coroutines FlowZorluk 2
Coroutine builder'ları olarak launch ile async arasındaki temel fark nedir?
- a
launch sonuçsuz bir Job döndürür; async await edilebilir bir Deferred<T> döndürür.✓ - b
async her zaman Dispatchers.IO'da, launch her zaman Dispatchers.Main'de çalışır. - c
launch sadece runBlocking içinde çağrılabilir, async çağrılamaz. - dGerçek bir fark yoktur; aynı fonksiyonun takma adlarıdır.
Açıklama:İkisi de yeni bir coroutine başlatır, ama launch fire-and-forget'tir (Job'u sadece tamamlanma/iptali izler), async ise daha sonra await() ile alacağınız bir değeri hesaplamak içindir.
Kt Kotlin Coroutines FlowZorluk 2
Bir coroutineScope { ... } bloğu içinde, eşzamanlı başlatılmış iki child coroutine'den biri exception fırlatıyor. Kardeş coroutine'e ve scope'a ne olur?
- aKardeş etkilenmeden tamamlanana kadar çalışmaya devam eder; sadece başarısız olan child'ın sonucu kaybolur.
- bScope'un parent fonksiyonu dönene kadar hiçbir şey olmaz.
- c
coroutineScope tüm child exception'larını yakaladığı için exception sessizce yutulur. - dKardeş iptal edilir ve exception
coroutineScope bloğunun dışına yayılır.✓
Açıklama:coroutineScope, fail-fast semantiğiyle structured concurrency kullanır: yakalanmamış bir child hatası tüm kardeş child'ları iptal eder ve scope'un kendisinden yeniden fırlatılır. Bu, kardeşlerin izole olduğu supervisorScope'tan farklıdır.
Kt Kotlin Coroutines FlowZorluk 1
Android coroutine'lerinde Dispatchers.Main genel olarak ne için kullanılır?
- aDisk ya da network I/O işlemlerini çalıştırmak için.
- bCPU-yoğun arka plan hesaplamasını çalıştırmak için.
- cUI thread'ine dokunması gereken kodu çalıştırmak için.✓
- dAsla iptal edilmemesi gereken kodu çalıştırmak için.
Açıklama:Dispatchers.Main çalışmayı UI (ana) thread'ine sınırlar — herhangi bir View/UI güncellemesi için gereklidir — Dispatchers.IO ve Dispatchers.Default ise sırasıyla bloklayan I/O ve CPU-yoğun iş içindir.
Kt Kotlin Coroutines FlowZorluk 2
Dispatchers.IO, Dispatchers.Default'a göre neden tipik olarak çok daha büyük bir thread pool'u kullanır?
- aÇünkü I/O görevleri hesaplama görevlerinden daha fazla CPU çekirdeği gerektirir.
- bÇünkü
Dispatchers.IO UI thread'inde çalışır ve bunun için ekstra kapasiteye ihtiyaç duyar. - cÇünkü I/O çoğunlukla CPU kullanmak yerine dış kaynakları bekler.✓
- dİkisi arasında pool boyutu açısından gerçek bir fark yoktur.
Açıklama:Dispatchers.Default, CPU çekirdek sayısına göre boyutlandırılır (hesaplama-ağırlıklı iş), Dispatchers.IO ise I/O işinin çoğu zamanını CPU tüketmeden beklemekle geçirdiği için çok daha fazla eşzamanlı bloklanmış thread'e izin verir.