Coroutine en KOTLIN: launch() et async()
Pour bien comprendre les bases de la programmation asynchrone en KOTLIN, le mieux est le lien suivant: ici
Le code ci-dessous est un exemple pour bien comprendre le comportement de join().
A insérer dans onCreate()
/////////////////////// exemple 1 /////////////////////////
runBlocking {
// runBlocking démarre dans le Thread courant, on est maintenant
// à l'intérieur d'un CoroutineScope, cela veut dire que nous
// avons engendrer une variable:
// val coroutineContext:CoroutineContext
// pour ce context. Le runBlocking() se termine lorsque
// tout ce qui est dedans est fait.
println("étape 1: Démarrage à l'intérieur du runBlocking()")
coroutineScope {
println("étape 2: Début de coroutineScope() I")
delay(500L)
println("étape 3: Après le délais de 500ms dans coroutineScope() I")
coroutineScope {
println("étape 4: Début de coroutineScope() II")
// Si on ajoute la ligne throw..., les deux coroutineScope()
// et runBlocking() échouent prématurément:
// throw CancellationException("4.")
// Car le runBlocking transporte l'exception en dehors et létape 16 ne se réalise jamais
}
println("étape 5: Fin de coroutineScope() I")
}
val job1 = launch {
// Ce launch se déroule en arrière plan, donc
// l'étape 8 arrive avant l'étape 7.
println("étape 6: Début du launch()")
delay(2500)
println("étape 7: Fin du launch()")
}
println("___ étape 8 ___")
departAsync = System.currentTimeMillis()
val deferr1 = async {
// Ce async se déroule en arrière plan, mais retourne quelquechose.
println("étape 9: Début de async")
delay(800)
println("étape 10: Fin de async")
"valeur retournée par deferr1"
}
println("étape 11: juste après l'objet deferr1 créé par async()")
job1.join()
println("étape 12: .join() oblige à attendre la fin de job1")
println(" ..... et bloque le thread parent pour cela")
// si on met 500ms dans job1 ecartTempsAsync est à 804ms
// si on met 2500ms dans job1 ecartTempsAsync est à 2502ms
val res1 = deferr1.await()
println("étape 13 : résultat de async(): $res1")
ecartTempsAsync = System.currentTimeMillis()-departAsync
println("durée d'éxécution de async: $ecartTempsAsync")
println("étape 14 : async finish")
println("étape 15 : Fin du runBlocking()")
}
println("étape 16 : Sortie du runBlocking()")
/////////////////////// fin exemple 1 /////////////////////////