11. Coroutines
suspend fun getTokenAsync() {...}
suspend fun getEventsAsync() {...}
suspend fun listEvents() {
val token = getTokenAsync()
val events = getEventsAsync(token)
displayEvents(events)
}
12. Coroutines
Coroutines permitem que você escreva seu código de forma
sequencial e cria light-weight threads para lidar com o código
assíncrono.
13. Coroutines
Coroutines precisam de um contexto especial para rodar,
portanto elas só rodam dentro de Coroutine Builders ou
dentro de outras Coroutines
20. Coroutines Builders
Launch - Job Cancel
val job = launch {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
}
delay(1300L) // delay a bit
println("main: I'm tired of waiting!")
job.cancel() // cancels the job
job.join() // waits for job's completion
println("main: Now I can quit.")
21. Coroutines Builders
Launch - Job Cancel
val job = launch {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
}
delay(1300L) // delay a bit
println("main: I'm tired of waiting!")
job.cancel() // cancels the job
job.join() // waits for job's completion
println("main: Now I can quit.")
I'm sleeping 0 ...
I'm sleeping 1 ...
I'm sleeping 2 ...
main: I'm tired of waiting!
main: Now I can quit.
22. Coroutines Builders
Launch - Job Cancel And Join
val job = launch {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
}
delay(1300L) // delay a bit
println("main: I'm tired of waiting!")
job.cancelAndJoin()
println("main: Now I can quit.")
I'm sleeping 0 ...
I'm sleeping 1 ...
I'm sleeping 2 ...
main: I'm tired of waiting!
main: Now I can quit.
23. Coroutines Builders
Launch - Quando a Coroutine para de ser processada ?
val job = launch {
var i = 0
while (i <= 5000) {
println("I'm sleeping ${i++} ...")
}
}
delay(1300L)
println("main: I'm tired of waiting!")
job.cancelAndJoin()
println("main: Now I can quit.")
I'm sleeping 0 ...
I'm sleeping 1 ...
I'm sleeping 2 …
…
I'm sleeping 5000 …
main: I'm tired of waiting!
main: Now I can quit.
24. Coroutines Builders
Launch - Garantindo que a Coroutine vai parar quando solicitado
val job = launch {
var i = 0
while (isActive) {
if(i <= 5000) { println("I'm sleeping ${i++} ...")}
}
delay(1000)
println("main: I'm tired of waiting!")
job.cancelAndJoin()
println("main: Now I can quit.")
I'm sleeping 0 ...
I'm sleeping 1 ...
I'm sleeping 2 ...
main: I'm tired of waiting!
main: Now I can quit.
38. Coroutines - non-preemptive multi-tasking
Usar os recursos de forma
eficiente e multi-tarefas
colaborativa onde as
próprias funções controlam o
fluxo, disponibilizam a
thread e continuam depois de
onde pararam, sem a
intervenção de um SO.
39. Coroutines - SÃO light-weight threads
val jobs = List(100_000) {
launch {
delay(1000L)
print(".")
}
}
jobs.forEach { it.join() }
53. Convertendo para CPS
suspend fun listEvents() {
// Label 0
val token = getToken()
// Label 1
val events = getEvents(token)
// Label 2
displayEvents(events)
}
54. Convertendo para CPS
suspend fun listEvents(Continuation<Void> cont) {
val sm = object: CoroutineImpl {...}
switch(sm.label) {
case 0:
getToken(sm)
case 1:
getEvents(sm.token, sm)
case 2:
displayEvents(sm.events)
}
}
55. Convertendo para CPS
suspend fun listEvents(Continuation<Void> cont) {
val sm = object: CoroutineImpl {...}
switch(sm.label) {
case 0:
sm.label = 1
getToken(sm)
case 1:
...
}
}
56. Convertendo para CPS
suspend fun listEvents(Continuation<Void> cont) {
val sm = object: CoroutineImpl {
fun resume(...) {
listEvents(this)
}
}
switch(sm.label) {
case 0:
...
}
}
57. Convertendo para CPS
suspend fun listEvents(Continuation<Void> cont) {
val sm = object: CoroutineImpl {...}
switch(sm.label) {
case 0:
...
case 1:
sm.label = 2
getEvents(sm.token, sm)
}
}
59. Extension em Strings
fun String.toNumber(): String {
return NumberFormat.getInstance()
.format(this.toDouble())
}
60. Extension em Strings
fun String.toNumber(): String {
return NumberFormat.getInstance()
.format(this.toDouble())
}
val numberString = “1”
val number = numberString.toNumber()
67. Referências
KotlinConf 2017 - Introduction to Coroutines by Roman Elizarov
https://www.youtube.com/watch?v=_hfBv0a09Jc&t=34s
KotlinConf 2017 Deep Dive into Coroutines on JVM by Roman Elizarov
https://www.youtube.com/watch?v=YrrUCSi72E8
Github official: https://github.com/Kotlin/kotlinx.coroutines
Android + kotlin coroutines: Async de um jeito "diferente", por Walmyr Carvalho (Android Meetup #55)
https://www.youtube.com/watch?v=Yr2p4gLUwBA