SlideShare a Scribd company logo
1 of 54
Download to read offline
ANDROID ASSÍNCRONO
De RxJava a Coroutines e WorkManager
/_rafaeltoledo
/rafaeltoledo
O PROBLEMA DO
ASSINCRONISMO
3
"Eu adoro código assíncrono, nunca dá problema!"
4
"Eu adoro código assíncrono, nunca dá problema!"
Ninguém, 2018
5
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
lifecycle
7
lifecycle
8
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?)
RXJAVA
10
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
Ah, mas você tá usando RxJava, me explica aí como funciona
12
13
RxJava - quando eu uso?
14
● Múltiplas fontes de dados que precisam ser
trabalhadas juntas
● Fluxo contínuo de dados
● UI dinâmica (reativa)
KOTLIN COROUTINES
15
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"
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!
Kotlin Coroutines
18
// Expectativa
fun performRequest() {
view.showLoading()
val result = api.fetch()
view.hideLoading()
textView.setText(result.data)
}
19
Kotlin Coroutines
20
fun performRequest() = launch(UI) {
view.showLoading()
val result = withContext(CommonPool) { api.fetch() }
view.hideLoading()
textView.setText(result.data)
}
Kotlin Coroutines
21
fun performRequest() = launch(UI) {
view.showLoading()
val result = withContext(CommonPool) { api.fetch() }
view.hideLoading()
textView.setText(result.data)
}
Kotlin Coroutines
22
fun performRequest() = launch(UI) {
view.showLoading()
val result = withContext(CommonPool) { api.fetch() }
view.hideLoading()
textView.setText(result.data)
}
Kotlin Coroutines
23
fun performRequest() = launch(UI) {
view.showLoading()
val result = withContext(CommonPool) { api.fetch() }
view.hideLoading()
textView.setText(result.data)
}
Kotlin Coroutines - Contextos
24
● UI: executa na main thread
● CommonPool: executa em uma thread em
background
● Unconfined: executa na mesma thread
Kotlin Coroutines
25
fun performRequest() = launch(UI) {
view.showLoading()
// Joga exception...?
val result = withContext(CommonPool) { api.fetch() }
view.hideLoading()
textView.setText(result.data)
}
26
Kotlin Coroutines
27
fun performRequest() = launch(UI) {
view.showLoading()
try {
val result = withContext(CommonPool) { api.fetch() }
textView.setText(result.data)
} catch (exception: IOException) {
textView.setText(exception.message)
}
view.hideLoading()
}
Kotlin Coroutines - Deferred
28
interface API {
fun fetch(): Deferred<Response> {
// ...
}
}
Kotlin Coroutines
29
fun performRequest() = async(UI) {
view.showLoading()
try {
val task = async(CommonPool) { api.fetch() }
val result = task.await()
textView.setText(result.data)
} catch (exception: IOException) {
textView.setText(exception.message)
}
view.hideLoading()
}
Kotlin Coroutines
30
fun performRequest() = async(UI) {
view.showLoading()
try {
val task = async(CommonPool) { api.fetch() }
val result = task.await()
textView.setText(result.data)
} catch (exception: IOException) {
textView.setText(exception.message)
}
view.hideLoading()
}
Mas eu ainda uso Java no meu projeto...
31
32
WORKMANAGER
33
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
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
WorkManager - API
36
class FirstWorker : Worker() {
override fun doWork(): Result {
TODO()
}
}
WorkManager - API
37
class FirstWorker : Worker() {
override fun doWork(): Result {
return Result.SUCCESS
}
}
WorkManager - API
38
class FirstWorker : Worker() {
override fun doWork(): Result {
return Result.FAILURE
}
}
WorkManager - API
39
class FirstWorker : Worker() {
override fun doWork(): Result {
return Result.RETRY
}
}
WorkManager - API
40
class FirstWorker : Worker() {
override fun doWork(): Result {
inputData
applicationContext
}
}
WorkManager - Agendamento Simples
41
val firstWork = OneTimeWorkRequest.Builder(FirstWorker::class.java)
.build()
WorkManager.getInstance()?.enqueue(firstWork)
WorkManager - Agendamento Simples
42
val firstWork = OneTimeWorkRequest.Builder(FirstWorker::class.java)
.build()
WorkManager.getInstance()?.enqueue(firstWork)
WorkManager - Agendamento Simples
43
val firstWork = OneTimeWorkRequestBuilder<FirstWorker>()
.build()
WorkManager.getInstance()?.enqueue(firstWork)
WorkManager - Agendamento Simples
44
val firstWork = OneTimeWorkRequestBuilder<FirstWorker>()
.setInputData(Data.Builder()
.putString("key", "value")
.build())
.build()
WorkManager.getInstance()?.enqueue(firstWork)
WorkManager - Agendamento Simples
45
val firstWork = OneTimeWorkRequestBuilder<FirstWorker>()
.setInputData(mapOf("value" to "key").toWorkData())
.build()
WorkManager.getInstance()?.enqueue(firstWork)
// Dentro do método doWork()
inputData.getString("key", "Default Value")
WorkManager - Constraints
46
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresCharging(true)
.setRequiresBatteryNotLow(true)
.build()
val firstWork = OneTimeWorkRequestBuilder<FirstWorker>()
.setConstraints(constraints)
.setInputData(mapOf("value" to "key").toWorkData())
.build()
WorkManager - Constraints
47
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresCharging(true)
.setRequiresBatteryNotLow(true)
.build()
val firstWork = OneTimeWorkRequestBuilder<FirstWorker>()
.setConstraints(constraints)
.setInputData(mapOf("value" to "key").toWorkData())
.build()
WorkManager - Agendamento Periódico
48
// work-runtime-ktx
val periodicWork = PeriodicWorkRequestBuilder<FirstWorker>(1,
TimeUnit.DAYS).build()
WorkManager.getInstance()?.enqueue(periodicWork)
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
}
Worker - outras possibilidades
● Encadear workers
● Paralelizar workers
● Executar workers com delay
50
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
Links
KOTLIN COROUTINES
https://github.com/Kotlin/kotlinx.coroutines
A GUIDE TO KOTLIN COROUTINES BY EXAMPLE
https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md
WORKMANAGER
https://developer.android.com/topic/libraries/architecture/workmanager
52
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
OBRIGADO
Para perguntas ou sugestões:
Rafael Toledo
rdtoledo@thoughtworks.com
speakerdeck.com/rafaeltoledo
54

More Related Content

Similar to ANDROID ASSÍNCRONO: DE RXJAVA A COROUTINES E WORKMANAGER

Threads 10: CompletableFuture
Threads 10: CompletableFutureThreads 10: CompletableFuture
Threads 10: CompletableFutureHelder da Rocha
 
Utilitários para Programação Concorrente em Java (2005)
Utilitários para Programação Concorrente em Java (2005)Utilitários para Programação Concorrente em Java (2005)
Utilitários para Programação Concorrente em Java (2005)Helder da Rocha
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
Programação funcional com java 8
Programação funcional com java 8Programação funcional com java 8
Programação funcional com java 8Leonardo Neuwald
 
Programação Funcional com Java 8
Programação Funcional com Java 8Programação Funcional com Java 8
Programação Funcional com Java 8Cristian R. Silva
 
Jdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYJdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYraquelcarsi
 
JavaFX 8, Collections e Lambdas
JavaFX 8, Collections e LambdasJavaFX 8, Collections e Lambdas
JavaFX 8, Collections e LambdasjesuinoPower
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
Pilares do desenvolvimento Mobile no Nubank
 Pilares do desenvolvimento Mobile no Nubank Pilares do desenvolvimento Mobile no Nubank
Pilares do desenvolvimento Mobile no NubankDevCamp Campinas
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusDenis L Presciliano
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?Rafael Benevides
 
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...iMasters
 
Android: testes automatizados e TDD
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDDDextra
 
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010lucashungaro
 

Similar to ANDROID ASSÍNCRONO: DE RXJAVA A COROUTINES E WORKMANAGER (20)

Threads 10: CompletableFuture
Threads 10: CompletableFutureThreads 10: CompletableFuture
Threads 10: CompletableFuture
 
Utilitários para Programação Concorrente em Java (2005)
Utilitários para Programação Concorrente em Java (2005)Utilitários para Programação Concorrente em Java (2005)
Utilitários para Programação Concorrente em Java (2005)
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
Programação funcional com java 8
Programação funcional com java 8Programação funcional com java 8
Programação funcional com java 8
 
Programação Funcional com Java 8
Programação Funcional com Java 8Programação Funcional com Java 8
Programação Funcional com Java 8
 
Jdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYJdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITY
 
JavaFX 8, Collections e Lambdas
JavaFX 8, Collections e LambdasJavaFX 8, Collections e Lambdas
JavaFX 8, Collections e Lambdas
 
Threads 09: Paralelismo
Threads 09: ParalelismoThreads 09: Paralelismo
Threads 09: Paralelismo
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
Pilares do desenvolvimento Mobile no Nubank
 Pilares do desenvolvimento Mobile no Nubank Pilares do desenvolvimento Mobile no Nubank
Pilares do desenvolvimento Mobile no Nubank
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com Cactus
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?
 
Kotlin first
Kotlin firstKotlin first
Kotlin first
 
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
[JS EXPERIENCE 2018] Uma visão geral sobre recursão e trampolines - Ana Basto...
 
Introdução Play framework
Introdução Play frameworkIntrodução Play framework
Introdução Play framework
 
Android: testes automatizados e TDD
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDD
 
Introdução ao JavaFX
Introdução ao JavaFXIntrodução ao JavaFX
Introdução ao JavaFX
 
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
 
JavaFX 1.2
JavaFX 1.2JavaFX 1.2
JavaFX 1.2
 

More from tdc-globalcode

TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidadeTDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidadetdc-globalcode
 
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...tdc-globalcode
 
TDC2019 Intel Software Day - ACATE - Cases de Sucesso
TDC2019 Intel Software Day - ACATE - Cases de SucessoTDC2019 Intel Software Day - ACATE - Cases de Sucesso
TDC2019 Intel Software Day - ACATE - Cases de Sucessotdc-globalcode
 
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPATDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPAtdc-globalcode
 
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVinoTDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVinotdc-globalcode
 
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...tdc-globalcode
 
TDC2019 Intel Software Day - Inferencia de IA em edge devices
TDC2019 Intel Software Day - Inferencia de IA em edge devicesTDC2019 Intel Software Day - Inferencia de IA em edge devices
TDC2019 Intel Software Day - Inferencia de IA em edge devicestdc-globalcode
 
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca PublicaTrilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publicatdc-globalcode
 
Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#tdc-globalcode
 
TDC2018SP | Trilha Go - Case Easylocus
TDC2018SP | Trilha Go - Case EasylocusTDC2018SP | Trilha Go - Case Easylocus
TDC2018SP | Trilha Go - Case Easylocustdc-globalcode
 
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?tdc-globalcode
 
TDC2018SP | Trilha Go - Clean architecture em Golang
TDC2018SP | Trilha Go - Clean architecture em GolangTDC2018SP | Trilha Go - Clean architecture em Golang
TDC2018SP | Trilha Go - Clean architecture em Golangtdc-globalcode
 
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QATDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QAtdc-globalcode
 
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendenciaTDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendenciatdc-globalcode
 
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR ServiceTDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Servicetdc-globalcode
 
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NETTDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NETtdc-globalcode
 
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8tdc-globalcode
 
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...tdc-globalcode
 
TDC2018SP | Trilha .Net - .NET funcional com F#
TDC2018SP | Trilha .Net - .NET funcional com F#TDC2018SP | Trilha .Net - .NET funcional com F#
TDC2018SP | Trilha .Net - .NET funcional com F#tdc-globalcode
 
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor em .Net Core
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor  em .Net CoreTDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor  em .Net Core
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor em .Net Coretdc-globalcode
 

More from tdc-globalcode (20)

TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidadeTDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
 
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
 
TDC2019 Intel Software Day - ACATE - Cases de Sucesso
TDC2019 Intel Software Day - ACATE - Cases de SucessoTDC2019 Intel Software Day - ACATE - Cases de Sucesso
TDC2019 Intel Software Day - ACATE - Cases de Sucesso
 
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPATDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
 
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVinoTDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
 
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
 
TDC2019 Intel Software Day - Inferencia de IA em edge devices
TDC2019 Intel Software Day - Inferencia de IA em edge devicesTDC2019 Intel Software Day - Inferencia de IA em edge devices
TDC2019 Intel Software Day - Inferencia de IA em edge devices
 
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca PublicaTrilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
 
Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#
 
TDC2018SP | Trilha Go - Case Easylocus
TDC2018SP | Trilha Go - Case EasylocusTDC2018SP | Trilha Go - Case Easylocus
TDC2018SP | Trilha Go - Case Easylocus
 
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
 
TDC2018SP | Trilha Go - Clean architecture em Golang
TDC2018SP | Trilha Go - Clean architecture em GolangTDC2018SP | Trilha Go - Clean architecture em Golang
TDC2018SP | Trilha Go - Clean architecture em Golang
 
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QATDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
 
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendenciaTDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
 
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR ServiceTDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
 
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NETTDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
 
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
 
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
 
TDC2018SP | Trilha .Net - .NET funcional com F#
TDC2018SP | Trilha .Net - .NET funcional com F#TDC2018SP | Trilha .Net - .NET funcional com F#
TDC2018SP | Trilha .Net - .NET funcional com F#
 
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor em .Net Core
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor  em .Net CoreTDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor  em .Net Core
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor em .Net Core
 

Recently uploaded

Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!Ilda Bicacro
 
FASE 1 MÉTODO LUMA E PONTO. TUDO SOBRE REDAÇÃO
FASE 1 MÉTODO LUMA E PONTO. TUDO SOBRE REDAÇÃOFASE 1 MÉTODO LUMA E PONTO. TUDO SOBRE REDAÇÃO
FASE 1 MÉTODO LUMA E PONTO. TUDO SOBRE REDAÇÃOAulasgravadas3
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...azulassessoria9
 
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....LuizHenriquedeAlmeid6
 
apostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médioapostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médiorosenilrucks
 
ATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇ
ATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇ
ATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇJaineCarolaineLima
 
2° ano_PLANO_DE_CURSO em PDF referente ao 2° ano do Ensino fundamental
2° ano_PLANO_DE_CURSO em PDF referente ao 2° ano do Ensino fundamental2° ano_PLANO_DE_CURSO em PDF referente ao 2° ano do Ensino fundamental
2° ano_PLANO_DE_CURSO em PDF referente ao 2° ano do Ensino fundamentalAntônia marta Silvestre da Silva
 
JOGO FATO OU FAKE - ATIVIDADE LUDICA(1).pptx
JOGO FATO OU FAKE - ATIVIDADE LUDICA(1).pptxJOGO FATO OU FAKE - ATIVIDADE LUDICA(1).pptx
JOGO FATO OU FAKE - ATIVIDADE LUDICA(1).pptxTainTorres4
 
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfProjeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfHELENO FAVACHO
 
11oC_-_Mural_de_Portugues_4m35.pptxTrabalho do Ensino Profissional turma do 1...
11oC_-_Mural_de_Portugues_4m35.pptxTrabalho do Ensino Profissional turma do 1...11oC_-_Mural_de_Portugues_4m35.pptxTrabalho do Ensino Profissional turma do 1...
11oC_-_Mural_de_Portugues_4m35.pptxTrabalho do Ensino Profissional turma do 1...licinioBorges
 
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptxSlides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptxLuizHenriquedeAlmeid6
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...azulassessoria9
 
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdfReta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdfWagnerCamposCEA
 
COMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕES
COMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕESCOMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕES
COMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕESEduardaReis50
 
Slides sobre as Funções da Linguagem.pptx
Slides sobre as Funções da Linguagem.pptxSlides sobre as Funções da Linguagem.pptx
Slides sobre as Funções da Linguagem.pptxMauricioOliveira258223
 
Historia da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdfHistoria da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdfEmanuel Pio
 
Música Meu Abrigo - Texto e atividade
Música   Meu   Abrigo  -   Texto e atividadeMúsica   Meu   Abrigo  -   Texto e atividade
Música Meu Abrigo - Texto e atividadeMary Alvarenga
 
Dicionário de Genealogia, autor Gilber Rubim Rangel
Dicionário de Genealogia, autor Gilber Rubim RangelDicionário de Genealogia, autor Gilber Rubim Rangel
Dicionário de Genealogia, autor Gilber Rubim RangelGilber Rubim Rangel
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...azulassessoria9
 

Recently uploaded (20)

Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!Rota das Ribeiras Camp, Projeto Nós Propomos!
Rota das Ribeiras Camp, Projeto Nós Propomos!
 
FASE 1 MÉTODO LUMA E PONTO. TUDO SOBRE REDAÇÃO
FASE 1 MÉTODO LUMA E PONTO. TUDO SOBRE REDAÇÃOFASE 1 MÉTODO LUMA E PONTO. TUDO SOBRE REDAÇÃO
FASE 1 MÉTODO LUMA E PONTO. TUDO SOBRE REDAÇÃO
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
 
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
 
apostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médioapostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médio
 
ATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇ
ATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇ
ATIVIDADE - CHARGE.pptxDFGHJKLÇ~ÇLJHUFTDRSEDFGJHKLÇ
 
2° ano_PLANO_DE_CURSO em PDF referente ao 2° ano do Ensino fundamental
2° ano_PLANO_DE_CURSO em PDF referente ao 2° ano do Ensino fundamental2° ano_PLANO_DE_CURSO em PDF referente ao 2° ano do Ensino fundamental
2° ano_PLANO_DE_CURSO em PDF referente ao 2° ano do Ensino fundamental
 
JOGO FATO OU FAKE - ATIVIDADE LUDICA(1).pptx
JOGO FATO OU FAKE - ATIVIDADE LUDICA(1).pptxJOGO FATO OU FAKE - ATIVIDADE LUDICA(1).pptx
JOGO FATO OU FAKE - ATIVIDADE LUDICA(1).pptx
 
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfProjeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
 
11oC_-_Mural_de_Portugues_4m35.pptxTrabalho do Ensino Profissional turma do 1...
11oC_-_Mural_de_Portugues_4m35.pptxTrabalho do Ensino Profissional turma do 1...11oC_-_Mural_de_Portugues_4m35.pptxTrabalho do Ensino Profissional turma do 1...
11oC_-_Mural_de_Portugues_4m35.pptxTrabalho do Ensino Profissional turma do 1...
 
Bullying, sai pra lá
Bullying,  sai pra láBullying,  sai pra lá
Bullying, sai pra lá
 
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptxSlides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
 
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdfReta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
 
COMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕES
COMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕESCOMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕES
COMPETÊNCIA 4 NO ENEM: O TEXTO E SUAS AMARRACÕES
 
Slides sobre as Funções da Linguagem.pptx
Slides sobre as Funções da Linguagem.pptxSlides sobre as Funções da Linguagem.pptx
Slides sobre as Funções da Linguagem.pptx
 
Historia da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdfHistoria da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdf
 
Música Meu Abrigo - Texto e atividade
Música   Meu   Abrigo  -   Texto e atividadeMúsica   Meu   Abrigo  -   Texto e atividade
Música Meu Abrigo - Texto e atividade
 
Dicionário de Genealogia, autor Gilber Rubim Rangel
Dicionário de Genealogia, autor Gilber Rubim RangelDicionário de Genealogia, autor Gilber Rubim Rangel
Dicionário de Genealogia, autor Gilber Rubim Rangel
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
 

ANDROID ASSÍNCRONO: DE RXJAVA A COROUTINES E WORKMANAGER

  • 1. ANDROID ASSÍNCRONO De RxJava a Coroutines e WorkManager
  • 4. "Eu adoro código assíncrono, nunca dá problema!" 4
  • 5. "Eu adoro código assíncrono, nunca dá problema!" Ninguém, 2018 5
  • 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
  • 13. 13
  • 14. RxJava - quando eu uso? 14 ● Múltiplas fontes de dados que precisam ser trabalhadas juntas ● Fluxo contínuo de dados ● UI dinâmica (reativa)
  • 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!
  • 18. Kotlin Coroutines 18 // Expectativa fun performRequest() { view.showLoading() val result = api.fetch() view.hideLoading() textView.setText(result.data) }
  • 19. 19
  • 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) }
  • 26. 26
  • 27. Kotlin Coroutines 27 fun performRequest() = launch(UI) { view.showLoading() try { val result = withContext(CommonPool) { api.fetch() } textView.setText(result.data) } catch (exception: IOException) { textView.setText(exception.message) } view.hideLoading() }
  • 28. Kotlin Coroutines - Deferred 28 interface API { fun fetch(): Deferred<Response> { // ... } }
  • 29. Kotlin Coroutines 29 fun performRequest() = async(UI) { view.showLoading() try { val task = async(CommonPool) { api.fetch() } val result = task.await() textView.setText(result.data) } catch (exception: IOException) { textView.setText(exception.message) } view.hideLoading() }
  • 30. Kotlin Coroutines 30 fun performRequest() = async(UI) { view.showLoading() try { val task = async(CommonPool) { api.fetch() } val result = task.await() textView.setText(result.data) } catch (exception: IOException) { textView.setText(exception.message) } view.hideLoading() }
  • 31. Mas eu ainda uso Java no meu projeto... 31
  • 32. 32
  • 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
  • 36. WorkManager - API 36 class FirstWorker : Worker() { override fun doWork(): Result { TODO() } }
  • 37. WorkManager - API 37 class FirstWorker : Worker() { override fun doWork(): Result { return Result.SUCCESS } }
  • 38. WorkManager - API 38 class FirstWorker : Worker() { override fun doWork(): Result { return Result.FAILURE } }
  • 39. WorkManager - API 39 class FirstWorker : Worker() { override fun doWork(): Result { return Result.RETRY } }
  • 40. WorkManager - API 40 class FirstWorker : Worker() { override fun doWork(): Result { inputData applicationContext } }
  • 41. WorkManager - Agendamento Simples 41 val firstWork = OneTimeWorkRequest.Builder(FirstWorker::class.java) .build() WorkManager.getInstance()?.enqueue(firstWork)
  • 42. WorkManager - Agendamento Simples 42 val firstWork = OneTimeWorkRequest.Builder(FirstWorker::class.java) .build() WorkManager.getInstance()?.enqueue(firstWork)
  • 43. WorkManager - Agendamento Simples 43 val firstWork = OneTimeWorkRequestBuilder<FirstWorker>() .build() WorkManager.getInstance()?.enqueue(firstWork)
  • 44. WorkManager - Agendamento Simples 44 val firstWork = OneTimeWorkRequestBuilder<FirstWorker>() .setInputData(Data.Builder() .putString("key", "value") .build()) .build() WorkManager.getInstance()?.enqueue(firstWork)
  • 45. WorkManager - Agendamento Simples 45 val firstWork = OneTimeWorkRequestBuilder<FirstWorker>() .setInputData(mapOf("value" to "key").toWorkData()) .build() WorkManager.getInstance()?.enqueue(firstWork) // Dentro do método doWork() inputData.getString("key", "Default Value")
  • 46. WorkManager - Constraints 46 val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .setRequiresCharging(true) .setRequiresBatteryNotLow(true) .build() val firstWork = OneTimeWorkRequestBuilder<FirstWorker>() .setConstraints(constraints) .setInputData(mapOf("value" to "key").toWorkData()) .build()
  • 47. WorkManager - Constraints 47 val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .setRequiresCharging(true) .setRequiresBatteryNotLow(true) .build() val firstWork = OneTimeWorkRequestBuilder<FirstWorker>() .setConstraints(constraints) .setInputData(mapOf("value" to "key").toWorkData()) .build()
  • 48. WorkManager - Agendamento Periódico 48 // work-runtime-ktx val periodicWork = PeriodicWorkRequestBuilder<FirstWorker>(1, TimeUnit.DAYS).build() WorkManager.getInstance()?.enqueue(periodicWork)
  • 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
  • 52. Links KOTLIN COROUTINES https://github.com/Kotlin/kotlinx.coroutines A GUIDE TO KOTLIN COROUTINES BY EXAMPLE https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md WORKMANAGER https://developer.android.com/topic/libraries/architecture/workmanager 52
  • 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