launch — özü, fire-and-forget coroutine başlatma ve nasıl çalıştığı

Yazar: IT Sectr Yayınlanma: 2026-06-22 Okuma süresi: 7 dk

launch — Kotlin'de bir Coroutine Builder'dır, sonuç döndürmeden bir coroutine başlatır ve yürütmeyi kontrol etmek için bir Job nesnesi döndürür. Bu builder fire-and-forget desenini uygular: coroutine arka plan iş parçacığında çalışmaya başlar ve otomatik olarak tamamlanır. JetBrains belgelerine, 2024 göre launch, Kotlin Coroutines'de paralel görevleri çalıştırmanın birincil yoludur.

Önemli noktalar

  • launch — sonuç döndürmeden coroutine başlatan builder (fire-and-forget)
  • Job — cancel(), join(), isActive metotlarına sahip coroutine kontrol nesnesi
  • launch, alt coroutine'lerin otomatik iptali için CoroutineScope ile entegre olur
  • CoroutineStart.LAZY, açık start() veya join() çağrısına kadar yürütmeyi ertelemeye izin verir
  • launch Android'de veritabanı kaydetme, ağ çağrıları ve UI güncellemeleri için kullanılır

Kotlin Coroutines'de launch nedir?

launch, kotlinx.coroutines import'u ile kullanılabilen bir Kotlin genişletme işlevidir ve belirtilen bir CoroutineScope içinde yeni bir coroutine oluşturur. Normal işlevlerin aksine, launch içindeki kod eşzamanlı olarak yürütülür — coroutine bir iş parçacığını bloke etmeden askıya alınabilir (suspend) ve daha sonra devam edebilir.

launch builder, Kotlin coroutine modelinin temel yapı taşıdır. Hesaplanmış bir değer döndürmez ancak coroutine yürütmesini kontrol etmeye izin veren bir Job nesnesi döndürür. Başka bir coroutine içinde launch ile başlatılan tüm alt coroutine'ler üst coroutine'e bağlanır.

launch'ın sözdizimi ve parametreleri

launch builder, birden çok parametreye sahip bir inline işlev olarak tanımlanır: CoroutineScope, CoroutineContext, CoroutineStart ve bir suspend bloğu. Parametrelerin varsayılan değerleri vardır, bu da launch'ı tipik senaryolar için kullanışlı hale getirir.

kotlin
public fun CoroutineScope.launch(
    context: CoroutineContext = EmptyCoroutineContext,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> Unit
): Job

context parametresi, bir dağıtıcı, istisna işleyicisi ve adlandırılmış öğeyi birleştiren bir CoroutineContext kabul eder. Çoğu zaman hata yalıtımı için Dispatchers.IO, Dispatchers.Main veya SupervisorJob iletilir.

Job ve yaşam döngüsü yönetimi

Job — coroutine'in yaşam döngüsünü temsil eden döndürülen nesne. Bir Job şu durumlarda olabilir: New, Active, Completing, Completed, Cancelling, Cancelled. Her durum yürütme durumunu yansıtır ve değişikliklere tepki vermeye izin verir.

kotlin
val job = CoroutineScope(Dispatchers.IO).launch {
    repeat(10) { i ->
        delay(1000L)
        println("İlerleme: $i")
    }
}

println("İş aktif: ${job.isActive}")
delay(2500L)
job.cancel()
println("İş iptal edildi: ${job.isCancelled}")

Job bir hiyerarşiyi destekler: üst coroutine iptal edilirse, tüm alt coroutine'ler otomatik olarak iptal edilir. SupervisorJob bu davranışı değiştirir — alt coroutine'lerden biri başarısız olduğunda diğerleri iptal edilmez.

launch'ta yapılandırılmış eşzamanlılık

Yapılandırılmış eşzamanlılık, her coroutine'in belirli bir CoroutineScope içinde başlatıldığı ve tüm alt coroutine'ler işlerini bitirene kadar scope'un tamamlanmadığı anlamına gelir. launch bu prensibi tamamen destekler — başka bir coroutine içinde başlatılan coroutine'ler onun alt öğeleridir.

İç içe launch çağrıları

İç içe launch çağrılarıyla bir coroutine ağacı oluşur. Üst coroutine tüm alt öğelerin tamamlanmasını bekler, öngörülebilir yürütme sırası sağlar ve kaynak yönetimini basitleştirir.

kotlin
fun main() = runBlocking {
    launch {
        launch {
            delay(1000L)
            println("Alt 1 tamamlandı")
        }
        launch {
            delay(500L)
            println("Alt 2 tamamlandı")
        }
        println("Tüm alt öğeler bu satırdan önce tamamlanır")
    }
}

Bu davranış, alt iş parçacıklarının üst iş parçacığına bağlı olmadığı iş parçacığı tabanlı eşzamanlılıktan farklıdır. Coroutine'lerde, tüm alt öğeler işlerini bitirene kadar üst öğe tamamlanmaz.

launch'ta istisna yönetimi

launch'ta istisna yönetimi Job türüne bağlıdır. Normal bir Job için istisnalar üst coroutine'e yayılır ve onu iptal eder. SupervisorJob veya SupervisorScope için istisnalar yalıtılır — bir alt coroutine'deki hata diğerlerini etkilemez.

kotlin
val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
scope.launch {
    try {
        riskyOperation()
    } catch (e: Exception) {
        println("Yakalandı: ${e.message}")
    }
}
scope.launch {
    println("Bu, SupervisorJob sayesinde hala çalışıyor")
}

Yakalanmayan istisnaların genel işlenmesi için CoroutineExceptionHandler kullanılır. Coroutine içinde işlenmeyen istisnaları yakalar ve uygulamayı çökertmeden hatayı günlüğe kaydetmeye izin verir.

Android'de launch kullanım örnekleri

Android'de launch her yerde kullanılır: ViewModel'den WorkManager'a kadar. Ana desen, bileşen yaşam döngüsü sona erdiğinde coroutine'leri otomatik iptal etmek için Fragment'te lifecycleScope ve ViewModel'de viewModelScope kullanmaktır.

kotlin
class ProfileViewModel : ViewModel() {
    private val repository = UserRepository()

    fun loadProfile(userId: String) {
        viewModelScope.launch(Dispatchers.IO) {
            val profile = repository.fetchProfile(userId)
            withContext(Dispatchers.Main) {
                _profileState.update { it.copy(profile = profile) }
            }
        }
    }
}

viewModelScope, ViewModel yok edildiğinde coroutine'leri otomatik olarak iptal eder. Bu, bellek sızıntılarını ortadan kaldırır ve bağlam kaybolduktan sonra arka plan işlemlerinin devam etmemesini sağlar. Ek olarak, dağıtıcılar arasında geçiş yapmak için withContext kullanılabilir.

Sıkça sorulan sorular

Kotlin Coroutines'de launch ve async arasındaki fark nedir?

launch bir Job döndürür ve sonuç döndürmezken, async sonucu almak için Deferred<T> döndürür. launch fire-and-forget işlemleri için kullanılır, async — döndürülen değeri beklemeniz ve kullanmanız gerektiğinde kullanılır.

launch ile başlatılan bir coroutine nasıl iptal edilir?

Kaydedilen Job nesnesinde job.cancel() çağrın. Grup iptali için scope.cancel() ile tüm CoroutineScope'u iptal edin. Coroutine işbirlikçi olmalıdır — isActive'i kontrol edin veya iptal edilebilir suspend işlevlerini kullanın.

launch bir istisna fırlatırsa ne yapmalı?

launch bloğu içinde try-catch kullanın veya CoroutineContext içinde CoroutineExceptionHandler iletin. Hata yalıtımı için SupervisorJob kullanın — o zaman bir alt coroutine'deki istisna diğerlerini iptal etmez.

launch CoroutineScope olmadan kullanılabilir mi?

Hayır, launch CoroutineScope'un bir genişletme işlevidir. Bir scope olmadan coroutine yapılandırılmış eşzamanlılık ilkesini takip edemez. GlobalScope.launch'ı dikkatli kullanın — yaşam döngüsüne bağlı olmayan bir coroutine oluşturur.

Aynı anda kaç launch coroutine çalıştırılabilir?

Sayı, dağıtıcının iş parçacığı havuzu tarafından sınırlanır. Dispatchers.Default, CPU çekirdeği sayısı kadar iş parçacığı kullanır. Dispatchers.IO, 64 iş parçacığına kadar destekler. Daha fazla coroutine başlatılırsa sıraya alınırlar.

Özet

  • launch — fire-and-forget coroutine'ler için ana builder, Job nesnesi döndürür
  • Job kontrol metotları sağlar: cancel(), join(), isActive, isCancelled, isCompleted
  • Yapılandırılmış eşzamanlılık üst iptal edildiğinde alt coroutine'lerin iptalini garanti eder
  • İstisna yönetimi Job türüne bağlıdır: normal hataları yayar, SupervisorJob yalıtır
  • lifecycleScope ve viewModelScope — Android'de coroutine başlatmak için hazır çözümler
  • CoroutineStart.LAZY açık start() veya join() çağrısına kadar yürütmeyi erteler
  • launch Android'de ağ istekleri, veritabanı yazma, analitik ve önbellekleme için kullanılır

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun