SlideShare uma empresa Scribd logo
1 de 54
Baixar para ler 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

Mais conteúdo relacionado

Semelhante a 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
 

Semelhante a 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
 

Mais de 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
 

Mais de 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
 

Último

Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptxSlides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptxLuizHenriquedeAlmeid6
 
Manual da CPSA_1_Agir com Autonomia para envio
Manual da CPSA_1_Agir com Autonomia para envioManual da CPSA_1_Agir com Autonomia para envio
Manual da CPSA_1_Agir com Autonomia para envioManuais Formação
 
Apresentação | Eleições Europeias 2024-2029
Apresentação | Eleições Europeias 2024-2029Apresentação | Eleições Europeias 2024-2029
Apresentação | Eleições Europeias 2024-2029Centro Jacques Delors
 
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
 
Pedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptxPedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptxleandropereira983288
 
William J. Bennett - O livro das virtudes para Crianças.pdf
William J. Bennett - O livro das virtudes para Crianças.pdfWilliam J. Bennett - O livro das virtudes para Crianças.pdf
William J. Bennett - O livro das virtudes para Crianças.pdfAdrianaCunha84
 
Slides Lição 5, CPAD, Os Inimigos do Cristão, 2Tr24, Pr Henrique.pptx
Slides Lição 5, CPAD, Os Inimigos do Cristão, 2Tr24, Pr Henrique.pptxSlides Lição 5, CPAD, Os Inimigos do Cristão, 2Tr24, Pr Henrique.pptx
Slides Lição 5, CPAD, Os Inimigos do Cristão, 2Tr24, Pr Henrique.pptxLuizHenriquedeAlmeid6
 
Slides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptx
Slides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptxSlides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptx
Slides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptxLuizHenriquedeAlmeid6
 
ABRIL VERDE.pptx Slide sobre abril ver 2024
ABRIL VERDE.pptx Slide sobre abril ver 2024ABRIL VERDE.pptx Slide sobre abril ver 2024
ABRIL VERDE.pptx Slide sobre abril ver 2024Jeanoliveira597523
 
D9 RECONHECER GENERO DISCURSIVO SPA.pptx
D9 RECONHECER GENERO DISCURSIVO SPA.pptxD9 RECONHECER GENERO DISCURSIVO SPA.pptx
D9 RECONHECER GENERO DISCURSIVO SPA.pptxRonys4
 
UFCD_10392_Intervenção em populações de risco_índice .pdf
UFCD_10392_Intervenção em populações de risco_índice .pdfUFCD_10392_Intervenção em populações de risco_índice .pdf
UFCD_10392_Intervenção em populações de risco_índice .pdfManuais Formação
 
“Sobrou pra mim” - Conto de Ruth Rocha.pptx
“Sobrou pra mim” - Conto de Ruth Rocha.pptx“Sobrou pra mim” - Conto de Ruth Rocha.pptx
“Sobrou pra mim” - Conto de Ruth Rocha.pptxthaisamaral9365923
 
Mapa mental - Classificação dos seres vivos .docx
Mapa mental - Classificação dos seres vivos .docxMapa mental - Classificação dos seres vivos .docx
Mapa mental - Classificação dos seres vivos .docxBeatrizLittig1
 
RedacoesComentadasModeloAnalisarFazer.pdf
RedacoesComentadasModeloAnalisarFazer.pdfRedacoesComentadasModeloAnalisarFazer.pdf
RedacoesComentadasModeloAnalisarFazer.pdfAlissonMiranda22
 
Programa de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades MotorasPrograma de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades MotorasCassio Meira Jr.
 
trabalho wanda rocha ditadura
trabalho wanda rocha ditaduratrabalho wanda rocha ditadura
trabalho wanda rocha ditaduraAdryan Luiz
 
activIDADES CUENTO lobo esta CUENTO CUARTO GRADO
activIDADES CUENTO  lobo esta  CUENTO CUARTO GRADOactivIDADES CUENTO  lobo esta  CUENTO CUARTO GRADO
activIDADES CUENTO lobo esta CUENTO CUARTO GRADOcarolinacespedes23
 
A Arte de Escrever Poemas - Dia das Mães
A Arte de Escrever Poemas - Dia das MãesA Arte de Escrever Poemas - Dia das Mães
A Arte de Escrever Poemas - Dia das MãesMary Alvarenga
 

Último (20)

Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptxSlides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
 
Manual da CPSA_1_Agir com Autonomia para envio
Manual da CPSA_1_Agir com Autonomia para envioManual da CPSA_1_Agir com Autonomia para envio
Manual da CPSA_1_Agir com Autonomia para envio
 
Apresentação | Eleições Europeias 2024-2029
Apresentação | Eleições Europeias 2024-2029Apresentação | Eleições Europeias 2024-2029
Apresentação | Eleições Europeias 2024-2029
 
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
 
Pedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptxPedologia- Geografia - Geologia - aula_01.pptx
Pedologia- Geografia - Geologia - aula_01.pptx
 
William J. Bennett - O livro das virtudes para Crianças.pdf
William J. Bennett - O livro das virtudes para Crianças.pdfWilliam J. Bennett - O livro das virtudes para Crianças.pdf
William J. Bennett - O livro das virtudes para Crianças.pdf
 
Slides Lição 5, CPAD, Os Inimigos do Cristão, 2Tr24, Pr Henrique.pptx
Slides Lição 5, CPAD, Os Inimigos do Cristão, 2Tr24, Pr Henrique.pptxSlides Lição 5, CPAD, Os Inimigos do Cristão, 2Tr24, Pr Henrique.pptx
Slides Lição 5, CPAD, Os Inimigos do Cristão, 2Tr24, Pr Henrique.pptx
 
Slides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptx
Slides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptxSlides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptx
Slides Lição 04, Central Gospel, O Tribunal De Cristo, 1Tr24.pptx
 
Em tempo de Quaresma .
Em tempo de Quaresma                            .Em tempo de Quaresma                            .
Em tempo de Quaresma .
 
ABRIL VERDE.pptx Slide sobre abril ver 2024
ABRIL VERDE.pptx Slide sobre abril ver 2024ABRIL VERDE.pptx Slide sobre abril ver 2024
ABRIL VERDE.pptx Slide sobre abril ver 2024
 
D9 RECONHECER GENERO DISCURSIVO SPA.pptx
D9 RECONHECER GENERO DISCURSIVO SPA.pptxD9 RECONHECER GENERO DISCURSIVO SPA.pptx
D9 RECONHECER GENERO DISCURSIVO SPA.pptx
 
UFCD_10392_Intervenção em populações de risco_índice .pdf
UFCD_10392_Intervenção em populações de risco_índice .pdfUFCD_10392_Intervenção em populações de risco_índice .pdf
UFCD_10392_Intervenção em populações de risco_índice .pdf
 
“Sobrou pra mim” - Conto de Ruth Rocha.pptx
“Sobrou pra mim” - Conto de Ruth Rocha.pptx“Sobrou pra mim” - Conto de Ruth Rocha.pptx
“Sobrou pra mim” - Conto de Ruth Rocha.pptx
 
Mapa mental - Classificação dos seres vivos .docx
Mapa mental - Classificação dos seres vivos .docxMapa mental - Classificação dos seres vivos .docx
Mapa mental - Classificação dos seres vivos .docx
 
RedacoesComentadasModeloAnalisarFazer.pdf
RedacoesComentadasModeloAnalisarFazer.pdfRedacoesComentadasModeloAnalisarFazer.pdf
RedacoesComentadasModeloAnalisarFazer.pdf
 
XI OLIMPÍADAS DA LÍNGUA PORTUGUESA -
XI OLIMPÍADAS DA LÍNGUA PORTUGUESA      -XI OLIMPÍADAS DA LÍNGUA PORTUGUESA      -
XI OLIMPÍADAS DA LÍNGUA PORTUGUESA -
 
Programa de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades MotorasPrograma de Intervenção com Habilidades Motoras
Programa de Intervenção com Habilidades Motoras
 
trabalho wanda rocha ditadura
trabalho wanda rocha ditaduratrabalho wanda rocha ditadura
trabalho wanda rocha ditadura
 
activIDADES CUENTO lobo esta CUENTO CUARTO GRADO
activIDADES CUENTO  lobo esta  CUENTO CUARTO GRADOactivIDADES CUENTO  lobo esta  CUENTO CUARTO GRADO
activIDADES CUENTO lobo esta CUENTO CUARTO GRADO
 
A Arte de Escrever Poemas - Dia das Mães
A Arte de Escrever Poemas - Dia das MãesA Arte de Escrever Poemas - Dia das Mães
A Arte de Escrever Poemas - Dia das Mães
 

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