launch — Coroutine Builder in Kotlin die een coroutine start zonder een resultaat terug te geven en een Job-object retourneert voor het beheren van de uitvoering. Deze builder implementeert het fire-and-forget patroon: de coroutine begint op de achtergrond en eindigt automatisch. Volgens documentatie van JetBrains, 2024, is launch de belangrijkste manier om parallelle taken te starten in Kotlin Coroutines.
Belangrijkste punten
launch — is een Kotlin-uitbreidingsfunctie, beschikbaar via import kotlinx.coroutines, die een nieuwe coroutine maakt in een opgegeven CoroutineScope. In tegenstelling tot gewone functies wordt code binnen launch gelijktijdig uitgevoerd — de coroutine kan worden onderbroken (suspend) zonder de thread te blokkeren en later worden hervat.
De launch-builder is een fundamenteel bouwblok van het coroutine-model van Kotlin. Het geeft geen berekende waarde terug, maar retourneert een Job-object waarmee de uitvoering van de coroutine kan worden gecontroleerd. Alle kind-coroutines die via launch binnen een andere coroutine worden gestart, zijn gekoppeld aan de ouder.
De launch-builder is gedefinieerd als een inline-functie met meerdere parameters: CoroutineScope, CoroutineContext, CoroutineStart en suspend-block. De parameters hebben standaardwaarden, wat launch handig maakt voor typische scenario's.
public fun CoroutineScope.launch(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job
De parameter context accepteert een CoroutineContext die de dispatcher, uitzonderingshandler en een benoemd element combineert. Meestal worden Dispatchers.IO, Dispatchers.Main of SupervisorJob voor foutisolatie doorgegeven.
Job — het geretourneerde object dat de levenscyclus van de coroutine vertegenwoordigt. Job kan zich in de volgende toestanden bevinden: New, Active, Completing, Completed, Cancelling, Cancelled. Elke toestand weerspiegelt de uitvoeringsstatus en maakt reactie op wijzigingen mogelijk.
val job = CoroutineScope(Dispatchers.IO).launch {
repeat(10) { i ->
delay(1000L)
println("Voortgang: $i")
}
}
println("Job is actief: ${job.isActive}")
delay(2500L)
job.cancel()
println("Job is geannuleerd: ${job.isCancelled}")
Job ondersteunt hiërarchie: als de oudercoroutine wordt geannuleerd, worden alle kind-coroutines automatisch geannuleerd. SupervisorJob verandert dit gedrag — kind-coroutines worden niet geannuleerd bij een fout van een van hen.
Gestructureerde concurrentie betekent dat elke coroutine in een specifieke CoroutineScope wordt gestart en de scope niet eindigt totdat alle kind-coroutines hun werk hebben voltooid. launch ondersteunt dit principe volledig — coroutines die binnen een andere coroutine worden gestart, zijn de kinderen ervan.
Bij geneste launch-aanroepen ontstaat een boom van coroutines. De oudercoroutine wacht op voltooiing van alle kinderen, wat een voorspelbare uitvoeringsvolgorde garandeert en resourcebeheer vereenvoudigt.
fun main() = runBlocking {
launch {
launch {
delay(1000L)
println("Kind 1 voltooid")
}
launch {
delay(500L)
println("Kind 2 voltooid")
}
println("Alle kinderen voltooid vóór deze regel")
}
}
Dit gedrag verschilt van thread-gebaseerde concurrentie, waar kind-threads niet aan de ouder zijn gekoppeld. In coroutines eindigt de ouder niet totdat alle kinderen hun werk hebben voltooid.
Uitzonderingsafhandeling in launch hangt af van het type Job. Voor een gewone Job verspreiden uitzonderingen zich naar de oudercoroutine en annuleren deze. Voor SupervisorJob of SupervisorScope worden uitzonderingen geïsoleerd — een fout in een kind-coroutine heeft geen invloed op de andere.
val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
scope.launch {
try {
riskyOperation()
} catch (e: Exception) {
println("Opgevangen: ${e.message}")
}
}
scope.launch {
println("Dit werkt nog steeds dankzij SupervisorJob")
}
Voor globale afhandeling van niet-afgevangen uitzonderingen wordt CoroutineExceptionHandler gebruikt. Het vangt uitzonderingen die niet binnen de coroutine zijn afgehandeld en maakt het mogelijk de fout te loggen zonder crash van de applicatie.
In Android wordt launch overal toegepast: van ViewModel tot WorkManager. Het belangrijkste patroon is het gebruik van lifecycleScope in Fragment en viewModelScope in ViewModel voor automatische annulering van coroutines aan het einde van de levenscyclus van het component.
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 annuleert automatisch coroutines bij vernietiging van de ViewModel. Dit elimineert geheugenlekken en garandeert dat achtergrondoperaties niet worden voortgezet na verlies van context. Aanvullend kan withContext worden gebruikt om tussen dispatchers te schakelen.
Veelgestelde vragen
launch retourneert Job en geen uitvoeringsresultaat, terwijl async Deferred<T> retourneert voor het verkrijgen van een resultaat. launch wordt gebruikt voor fire-and-forget operaties, async — wanneer u moet wachten op en de geretourneerde waarde moet gebruiken.
Roep job.cancel() aan op het opgeslagen Job-object. Voor groepsannulering annuleert u de hele CoroutineScope via scope.cancel(). De coroutine moet coöperatief zijn — isActive controleren of controleerbare suspend-functies gebruiken.
Gebruik try-catch binnen het launch-blok of geef CoroutineExceptionHandler door in CoroutineContext. Gebruik SupervisorJob voor foutisolatie — dan annuleert een uitzondering in één kind-coroutine de andere niet.
Nee, launch is een uitbreidingsfunctie van CoroutineScope. Zonder scope kan de coroutine het principe van gestructureerde concurrentie niet volgen. Gebruik GlobalScope.launch met voorzichtigheid — dit creëert een coroutine zonder koppeling aan de levenscyclus.
Het aantal wordt beperkt door de threadpool van de dispatcher. Dispatchers.Default gebruikt een aantal threads gelijk aan het aantal CPU-kernen. Dispatchers.IO ondersteunt tot 64 threads. Bij het starten van meer coroutines worden ze in een wachtrij geplaatst.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook