launch — lényege, fire-and-forget korutinok indítása és működése

Szerző: IT Sectr Megjelenés: 2026-06-22 Olvasási idő: 7 perc

launch — Coroutine Builder Kotlin-ban, amely korutint indít az eredmény visszaadása nélkül, és egy Job objektumot ad vissza a végrehajtás kezeléséhez. Ez a builder a fire-and-forget mintát valósítja meg: a korutin a háttérszálon kezdi meg a munkát és automatikusan befejeződik. A JetBrains dokumentáció, 2024 szerint a launch a párhuzamos feladatok indításának fő módja a Kotlin Coroutines-ben.

Főbb pontok

  • launch — builder korutinok indításához eredmény visszaadása nélkül (fire-and-forget)
  • Job — korutin kezelésére szolgáló objektum cancel(), join(), isActive metódusokkal
  • launch integrálódik a CoroutineScope-pal a gyermek korutinok automatikus törléséhez
  • CoroutineStart.LAZY lehetővé teszi az indítás elhalasztását az explicit start() vagy join() hívásig
  • launch Android-ban DB mentésre, hálózati hívásokra és UI frissítésre használatos

Mi a launch a Kotlin Coroutines-ben?

launch — egy Kotlin kiterjesztő függvény, amely a kotlinx.coroutines importon keresztül érhető el, és egy új korutint hoz létre a megadott CoroutineScope-ban. A szokásos függvényektől eltérően a launch-on belüli kód konkurensen hajtódik végre — a korutin felfüggeszthető (suspend) a szál blokkolása nélkül, és később folytatható.

A launch builder a Kotlin korutin modell alapvető építőköve. Nem ad vissza számított értéket, de visszaad egy Job objektumot, amely lehetővé teszi a korutin végrehajtásának vezérlését. A launch-on keresztül egy másik korutinban indított összes gyermek korutin a szülőhöz kapcsolódik.

A launch szintaxisa és paraméterei

A launch builder inline függvényként van definiálva több paraméterrel: CoroutineScope, CoroutineContext, CoroutineStart és suspend-blokk. A paraméterek alapértelmezett értékekkel rendelkeznek, ami a launch-ot kényelmessé teszi tipikus forgatókönyvekhez.

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

A context paraméter egy CoroutineContext-et fogad el, amely egyesíti a diszpécsert, a kivételkezelőt és egy elnevezett elemet. Leggyakrabban Dispatchers.IO, Dispatchers.Main vagy SupervisorJob kerül átadásra a hibák elkülönítéséhez.

Job és életciklus kezelés

Job — a visszaadott objektum, amely a korutin életciklusát képviseli. A Job a következő állapotokban lehet: New, Active, Completing, Completed, Cancelling, Cancelled. Minden állapot tükrözi a végrehajtás státuszát és lehetővé teszi a változásokra való reagálást.

kotlin
val job = CoroutineScope(Dispatchers.IO).launch {
    repeat(10) { i ->
        delay(1000L)
        println("Előrehaladás: $i")
    }
}

println("A Job aktív: ${job.isActive}")
delay(2500L)
job.cancel()
println("A Job törölve: ${job.isCancelled}")

A Job támogatja a hierarchiát: ha a szülő korutin törlésre kerül, az összes gyermek automatikusan törlődik. A SupervisorJob megváltoztatja ezt a viselkedést — a gyermek korutinok nem törlődnek az egyikük hibája esetén.

Strukturált konkurencia a launch-ban

A strukturált konkurencia azt jelenti, hogy minden korutin egy meghatározott CoroutineScope-ban indul, és a scope nem fejeződik be, amíg az összes gyermek korutin be nem fejezi a munkáját. A launch teljes mértékben támogatja ezt az elvet — a másik korutinban indított korutinok annak gyermekei.

Beágyazott launch hívások

Beágyazott launch indításakor egy korutin fa jön létre. A szülő korutin megvárja az összes gyermek befejeződését, ami kiszámítható végrehajtási sorrendet garantál és leegyszerűsíti az erőforrás-kezelést.

kotlin
fun main() = runBlocking {
    launch {
        launch {
            delay(1000L)
            println("1. gyermek befejeződött")
        }
        launch {
            delay(500L)
            println("2. gyermek befejeződött")
        }
        println("Minden gyermek befejeződött e sor előtt")
    }
}

Ez a viselkedés eltér a szál alapú konkurenciától, ahol a gyermek szálak nem kapcsolódnak a szülőhöz. Korutinokban a szülő nem fejeződik be, amíg az összes gyermek be nem fejezi a munkáját.

Kivételek kezelése a launch-ban

A kivételek kezelése a launch-ban a Job típusától függ. Egy szokásos Job esetén a kivételek terjednek a szülő korutinra és törlik azt. SupervisorJob vagy SupervisorScope esetén a kivételek elkülönülnek — egy gyermek korutin hibája nem érinti a többit.

kotlin
val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
scope.launch {
    try {
        riskyOperation()
    } catch (e: Exception) {
        println("Elkapva: ${e.message}")
    }
}
scope.launch {
    println("Ez még mindig működik a SupervisorJob-nak köszönhetően")
}

A le nem kezelt kivételek globális kezeléséhez CoroutineExceptionHandler használatos. Ez elkapja azokat a kivételeket, amelyek nem lettek kezelve a korutinban, és lehetővé teszi a hiba naplózását az alkalmazás összeomlása nélkül.

Példák a launch használatára Android-ban

Android-ban a launch mindenhol alkalmazásra kerül: a ViewModel-től a WorkManager-ig. A fő minta a lifecycleScope használata Fragment-ben és a viewModelScope használata ViewModel-ben a korutinok automatikus törléséhez a komponens életciklusának végén.

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) }
            }
        }
    }
}

A viewModelScope automatikusan törli a korutinokat a ViewModel megsemmisülésekor. Ez kiküszöböli a memóriaszivárgásokat és garantálja, hogy a háttérműveletek nem folytatódnak a kontextus elvesztése után. Ezenkívül a withContext használható a diszpécserek közötti váltáshoz.

Gyakran Ismételt Kérdések

Miben különbözik a launch az async-tól a Kotlin Coroutines-ben?

launch Job-ot ad vissza és nem ad vissza végrehajtási eredményt, míg az async Deferred<T>-t ad vissza az eredmény eléréséhez. A launch fire-and-forget műveletekhez használatos, az async — amikor meg kell várni és használni kell a visszaadott értéket.

Hogyan lehet törölni a launch-on keresztül indított korutint?

Hívja meg a job.cancel()-t a mentett Job objektumon. Csoportos törléshez törölje a teljes CoroutineScope-ot a scope.cancel()-en keresztül. A korutinnak kooperatívnak kell lennie — ellenőriznie kell az isActive-ot vagy használnia kell ellenőrizhető suspend függvényeket.

Mit tegyünk, ha a launch kivételt dobott?

Használjon try-catch-t a launch blokkon belül, vagy adjon át CoroutineExceptionHandler-t a CoroutineContext-ben. A hibák elkülönítéséhez használjon SupervisorJob-ot — akkor az egyik gyermek korutinban keletkező kivétel nem törli a többit.

Indítható-e launch CoroutineScope nélkül?

Nem, a launch a CoroutineScope kiterjesztő függvénye. Scope nélkül a korutin nem tudja követni a strukturált konkurencia elvét. Használja a GlobalScope.launch-ot óvatosan — ez egy életciklushoz nem kötött korutint hoz létre.

Hány launch korutin indítható egyszerre?

A számot a diszpécser szálkészlete korlátozza. Dispatchers.Default a CPU magok számával megegyező számú szálat használ. Dispatchers.IO akár 64 szálat is támogat. Több korutin indításakor azok sorba kerülnek.

Összefoglalás

  • launch — fő builder fire-and-forget korutinokhoz, Job objektumot ad vissza
  • Job kezelő metódusokat biztosít: cancel(), join(), isActive, isCancelled, isCompleted
  • Strukturált konkurencia garantálja a gyermek korutinok törlését a szülő törlésekor
  • Kivételkezelés a Job típusától függ: a szokásos terjeszti a hibákat, a SupervisorJob elkülöníti
  • lifecycleScope és viewModelScope — kész megoldások launch indításához Android-ban
  • CoroutineStart.LAZY elhalasztja az indítást az explicit start() vagy join() hívásig
  • A launch Android-ban hálózati kérésekhez, DB íráshoz, analitikához és gyorsítótárazáshoz használatos

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is