launch — un Coroutine Builder en Kotlin qui lance une coroutine sans retourner de résultat, renvoyant un objet Job pour contrôler l'exécution. Ce builder implémente le modèle fire-and-forget : la coroutine commence à travailler dans un thread d'arrière-plan et se termine automatiquement. Selon la documentation JetBrains, 2024, launch est le moyen principal d'exécuter des tâches parallèles dans Kotlin Coroutines.
Points clés
launch est une fonction d'extension de Kotlin, disponible via l'import kotlinx.coroutines, qui crée une nouvelle coroutine dans un CoroutineScope donné. Contrairement aux fonctions normales, le code à l'intérieur de launch s'exécute concurrentiellement — la coroutine peut se suspendre sans bloquer un thread et reprendre plus tard.
Le builder launch est un bloc fondamental du modèle de coroutines de Kotlin. Il ne renvoie pas de valeur calculée mais retourne un objet Job qui permet de contrôler l'exécution de la coroutine. Toutes les coroutines filles lancées via launch à l'intérieur d'une autre coroutine sont liées à la coroutine mère.
Le builder launch est défini comme une fonction inline avec plusieurs paramètres : CoroutineScope, CoroutineContext, CoroutineStart et un bloc suspend. Les paramètres ont des valeurs par défaut, ce qui rend launch pratique pour les scénarios typiques.
public fun CoroutineScope.launch(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job
Le paramètre context accepte un CoroutineContext qui combine un dispatcher, un gestionnaire d'exceptions et un élément nommé. Le plus souvent, Dispatchers.IO, Dispatchers.Main ou SupervisorJob sont passés pour isoler les erreurs.
Job — l'objet retourné représentant le cycle de vie de la coroutine. Un Job peut être dans les états : New, Active, Completing, Completed, Cancelling, Cancelled. Chaque état reflète le statut d'exécution et permet de réagir aux changements.
val job = CoroutineScope(Dispatchers.IO).launch {
repeat(10) { i ->
delay(1000L)
println("Progression : $i")
}
}
println("Le Job est actif : ${job.isActive}")
delay(2500L)
job.cancel()
println("Le Job est annulé : ${job.isCancelled}")
Job supporte une hiérarchie : si une coroutine mère est annulée, toutes les coroutines filles sont automatiquement annulées. SupervisorJob modifie ce comportement — les coroutines filles ne sont pas annulées lorsque l'une d'elles échoue.
La concurrence structurée signifie que chaque coroutine est lancée dans un CoroutineScope spécifique, et le scope ne se termine pas tant que toutes les coroutines filles n'ont pas fini leur travail. launch supporte pleinement ce principe — les coroutines lancées à l'intérieur d'une autre coroutine sont ses filles.
Avec des appels launch imbriqués, un arbre de coroutines se forme. La coroutine mère attend la fin de toutes les coroutines filles, garantissant un ordre d'exécution prévisible et simplifiant la gestion des ressources.
fun main() = runBlocking {
launch {
launch {
delay(1000L)
println("Enfant 1 terminé")
}
launch {
delay(500L)
println("Enfant 2 terminé")
}
println("Tous les enfants terminent avant cette ligne")
}
}
Ce comportement diffère de la concurrence basée sur les threads, où les threads fils ne sont pas liés au thread père. Dans les coroutines, la coroutine mère ne se termine pas tant que toutes les coroutines filles n'ont pas fini leur travail.
La gestion des exceptions dans launch dépend du type de Job. Pour un Job normal, les exceptions se propagent à la coroutine mère et l'annulent. Pour SupervisorJob ou SupervisorScope, les exceptions sont isolées — une erreur dans une coroutine fille n'affecte pas les autres.
val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
scope.launch {
try {
riskyOperation()
} catch (e: Exception) {
println("Attrapé : ${e.message}")
}
}
scope.launch {
println("Cela continue de fonctionner grâce à SupervisorJob")
}
Pour la gestion globale des exceptions non capturées, CoroutineExceptionHandler est utilisé. Il intercepte les exceptions qui n'ont pas été traitées à l'intérieur de la coroutine et permet de journaliser l'erreur sans planter l'application.
Dans Android, launch est utilisé partout : de ViewModel à WorkManager. Le modèle principal est l'utilisation de lifecycleScope dans Fragment et viewModelScope dans ViewModel pour l'annulation automatique des coroutines à la fin du cycle de vie du composant.
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 annule automatiquement les coroutines lorsque la ViewModel est détruite. Cela élimine les fuites et garantit que les opérations en arrière-plan ne continuent pas après la perte du contexte. De plus, withContext peut être utilisé pour basculer entre les dispatchers.
Questions fréquentes
launch retourne un Job et ne renvoie pas de résultat, tandis que async retourne Deferred<T> pour obtenir le résultat. launch est utilisé pour les opérations fire-and-forget, async — quand vous devez attendre et utiliser la valeur retournée.
Appelez job.cancel() sur l'objet Job sauvegardé. Pour une annulation groupée, annulez tout le CoroutineScope via scope.cancel(). La coroutine doit être coopérative — vérifiez isActive ou utilisez des fonctions suspend annulables.
Utilisez try-catch dans le bloc launch ou passez CoroutineExceptionHandler dans le CoroutineContext. Pour isoler les erreurs, utilisez SupervisorJob — alors une exception dans une coroutine fille n'annulera pas les autres.
Non, launch est une fonction d'extension de CoroutineScope. Sans scope, la coroutine ne peut pas suivre le principe de concurrence structurée. Utilisez GlobalScope.launch avec prudence — cela crée une coroutine sans liaison au cycle de vie.
Le nombre est limité par le pool de threads du dispatcher. Dispatchers.Default utilise autant de threads que de cœurs CPU. Dispatchers.IO supporte jusqu'à 64 threads. Si plus de coroutines sont lancées, elles sont mises en file d'attente.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi