O documento discute abordagens para programação assíncrona no Android, comparando RxJava, Kotlin Coroutines e WorkManager. Kotlin Coroutines permite escrever código assíncrono de forma sequencial, evitando callback hell. WorkManager é útil para tarefas que podem ser adiadas, como uploads e sincronizações.
6. Por que é um problema?
6
● Diminui a legibilidade do código
● Mais difícil de debugar
● Pode trazer problemas de concorrência
● Pode trazer problemas de desempenho
9. Abordagens "clássicas" e seus problemas
9
● AsyncTask - dificuldade em lidar com lifecycle,
facilidade em causar leaks de memória
● IntentService - API verbosa e a necessidade de
se criar um serviço para cada tarefa (ou uma
tarefa com muita lógica)
● Threads - pouco controle (ou controle demais?)
11. RxJava - o que é?
11
● Biblioteca parte das Reactive Extensions
● Mais que uma biblioteca de assincronismo
● Introduz paradigmas de programação reativa
funcional
● Tem uma curva de aprendizado íngreme
12. Ah, mas você tá usando RxJava, me explica aí como funciona
12
16. Kotlin Coroutines - o que é?
16
● Desde o Kotlin 1.1
● Permite escrever código assíncrono de forma
sequencial
● Evita complexidade
● Evita o famoso "callback hell"
17. Kotlin Coroutines - quando eu uso?
17
● Processamento assíncrono fora da main thread
○ Requests
○ I/O
○ Processamento
● kotlinx-coroutines-android permite fazer
a mudança para a main thread!
20. Kotlin Coroutines
20
fun performRequest() = launch(UI) {
view.showLoading()
val result = withContext(CommonPool) { api.fetch() }
view.hideLoading()
textView.setText(result.data)
}
21. Kotlin Coroutines
21
fun performRequest() = launch(UI) {
view.showLoading()
val result = withContext(CommonPool) { api.fetch() }
view.hideLoading()
textView.setText(result.data)
}
22. Kotlin Coroutines
22
fun performRequest() = launch(UI) {
view.showLoading()
val result = withContext(CommonPool) { api.fetch() }
view.hideLoading()
textView.setText(result.data)
}
23. Kotlin Coroutines
23
fun performRequest() = launch(UI) {
view.showLoading()
val result = withContext(CommonPool) { api.fetch() }
view.hideLoading()
textView.setText(result.data)
}
24. Kotlin Coroutines - Contextos
24
● UI: executa na main thread
● CommonPool: executa em uma thread em
background
● Unconfined: executa na mesma thread
25. Kotlin Coroutines
25
fun performRequest() = launch(UI) {
view.showLoading()
// Joga exception...?
val result = withContext(CommonPool) { api.fetch() }
view.hideLoading()
textView.setText(result.data)
}
34. WorkManager - quando usar?
Tarefas "adiáveis" - precisam ser executadas,
mesmo se o app for fechado, mas não precisam ser
executadas em um momento exato
É uma solução consistente semelhante ao
JobScheduler
Ex: upload de logs, sincronização com servidor,
tarefas de processamento pesado, que podem
demorar bastante
34
35. WorkManager
Utiliza em sua implementação JobScheduler,
Firebase JobDispatcher ou AlarmManager
// Atualmente na versão 1.0.0-alpha04
android.arch.work:work-runtime
:work-runtime-ktx
:work-testing
:work-firebase
35
49. WorkManager - Testes
49
@Before fun setUp() {
WorkManagerTestInitHelper.initializeTestWorkManager(
InstrumentationRegistry.getTargetContext())
// ...
}
@Test fun checkIfJobIsDone() {
val worker = ...
WorkManager.getInstance()?.enqueue(worker)
WorkManagerTestInitHelper.getTestDriver().setAllConstraintsMet(worker.id)
// Assertions
}
50. Worker - outras possibilidades
● Encadear workers
● Paralelizar workers
● Executar workers com delay
50
51. Worker - pontos importantes
● é executado após o sistema obter um wakelock -
não é necessário requisitar
● é executado numa thread em background
● não deve iniciar nenhuma nova thread - deve
retornar um status
● não pode rodar pra sempre - ~10 minutos
51
53. Links - vídeos
INTRODUCTION TO COROUTINES
https://www.youtube.com/watch?v=_hfBv0a09Jc
DEEP DIVE INTO COROUTINES ON JVM
https://www.youtube.com/watch?v=YrrUCSi72E8
EASY BACKGROUND PROCESSING WITH WORKMANAGER
https://www.youtube.com/watch?v=IrKoBFLwTN0
53
54. OBRIGADO
Para perguntas ou sugestões:
Rafael Toledo
rdtoledo@thoughtworks.com
speakerdeck.com/rafaeltoledo
54