Je voulais vous donner un exemple simple de la notion de continuation. C'est ce qu'une fonction de suspension ne peut geler, de suspendre puis il continue/reprise. Arrêter de penser de la coroutine en termes de threads et un Sémaphore. Pensez-y en termes de maintien et même le rappel des crochets.
Pour être clair, une courtine peut être mis en pause à l'aide d'un suspect fonction. permet d'étudier cette question:
dans android, nous pourrions le faire par exemple:
var TAG = "myTAG:"
fun myMethod() {
viewModelScope.launch(Dispatchers.Default) {
for (i in 10..15) {
if (i == 10) { //on first iteration, we will completely FREEZE this coroutine (just for loop here gets 'suspended`)
println("$TAG im a tired coroutine - let someone else print the numbers async. i'll suspend until your done")
freezePleaseIAmDoingHeavyWork()
} else
println("$TAG $i")
}
}
//this area is not suspended, you can continue doing work
}
suspend fun freezePleaseIAmDoingHeavyWork() {
withContext(Dispatchers.Default) {
async {
//pretend this is a big network call
for (i in 1..10) {
println("$TAG $i")
delay(1_000)//delay pauses coroutine, NOT the thread. use Thread.sleep if you want to pause a thread.
}
println("$TAG phwww finished printing those numbers async now im tired, thank you for freezing, you may resume")
}
}
}
qui imprime le suivant:
I: myTAG: my coroutine is frozen but i can carry on to do other things
I: myTAG: im a tired coroutine - let someone else print the numbers async. i'll suspend until your done
I: myTAG: 1
I: myTAG: 2
I: myTAG: 3
I: myTAG: 4
I: myTAG: 5
I: myTAG: 6
I: myTAG: 7
I: myTAG: 8
I: myTAG: 9
I: myTAG: 10
I: myTAG: phwww finished printing those numbers async now im tired, thank you for freezing, you may resume
I: myTAG: 11
I: myTAG: 12
I: myTAG: 13
I: myTAG: 14
I: myTAG: 15
imaginez qu'il fonctionne comme ceci:
si la fonction que vous lancé de ne pas s'arrêter, juste une coroutine va suspendre pendant qu'elle continue. le fil n'est pas suspendue par l'exécution d'une fonction de suspension.
je pense que ce site peut aider à vous tout de choses et c'est ma référence.
permet de faire quelque chose de cool et de geler notre fonction de suspension au moyen d'une itération. nous allons reprendre plus tard dans onResume:
stocker une variable appelée continuation et bien le charger avec les coroutines la poursuite de l'objet pour nous:
var continuation: CancellableContinuation<String>? = null
suspend fun freezeHere() = suspendCancellableCoroutine<String> {
continuation = it
}
fun unFreeze(){
continuation?.resume("im resuming") {}
}
maintenant, revenons à notre fonction de suspension et d'en faire geler la mi itération:
suspend fun freezePleaseIAmDoingHeavyWork() {
withContext(Dispatchers.Default) {
async {
//pretend this is a big network call
for (i in 1..10) {
println("$TAG $i")
delay(1_000)
if(i == 3)
freezeHere() //dead pause, do not go any further
}
}
}
}
puis ailleurs, comme dans onResume (par exemple):
override fun onResume() {
super.onResume()
unFreeze()
}
et la boucle continue. son assez agréable de savoir qu'on peut congeler une fonction de suspension à tout moment et le reprendre après un certain temps a passé. vous pouvez aussi regarder les chaînes