Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlin Coroutines [PT]

Kotlin Coroutines [PT]

In this session, we talk about Kotlin Coroutines and the best way to use it in Android development.

Manuel Ernesto

June 13, 2020
Tweet

More Decks by Manuel Ernesto

Other Decks in Programming

Transcript

  1. Android • Por padrão, tudo é executado na main thread

    • Main thread == UI • Desenhar as views • Eventos de UI • Bloquear a thread causa ANRs • ...
  2. Android • Processamento de eventos deve ser feito: ◦ <

    16ms para dispositivos 60Hz ◦ < 12ms para dispositivos 90Hz ◦ < 8ms para dispositivos 120Hz • Dropped frame
  3. Kotlin Coroutines, o que é • Funcionalidade do Kotlin •

    Criação de códigos assíncronos fácil • Paralelismo • Implementado no Kotlin 1.3 • Fácil de usar e evita “Callbacks hell”
  4. Kotlin Coroutines, porque usar • O uso não é limitado

    (!= threads) • Várias coroutines podem usar 1 única thread • Light-weight threads • Maior eficiência (Menor custo na criação e troca de contexto) • Callbacks -> Operações assíncronas
  5. Exemplo de performance • lança 100k coroutines • Após cada

    segundo imprime um coração e posição de i • Com threads, possivelmente teríamos Out Of Memory
  6. Suspend functions • Suspend functions são o centro de tudo

    ◦ função com o modificador suspend ◦ função que pode ser suspensa ◦ Pausadas e resumidas sem bloquear a main thread ◦ Por si só, não executa em uma thread separada. ◦ Só podem ser chamadas dentro de outra suspend
  7. Suspending x Blocking • Blocking só libera a thread depois

    de terminar • Suspend pode pausar a execução para outra função executar na mesma thread • Suspend retorna a execução após pausar • Suspend é função normal com um parâmetro a mais
  8. Criando uma Coroutine‍ • Funções básicas: ◦ launch ◦ async

    ◦ runBlocking • Precisamos de contexto (Dispatchers)
  9. Job • Tipo cancelável (a cancellable thing) • Ciclo de

    vida termina quando completo • Pode ser organizado de hierarquia (pai-filho) • Não retorna valor • Possui estados (new, active, completing, cancelling, cancelled & completed)
  10. Async • Cria uma coroutine • Recebe um contexto (Dispatchers)

    • Retorna um Deferred<T> • Deferred tem um método await() • permite maior paralelismo e controle
  11. runBlocking • Cria uma coroutine • Por padrão não recebe

    contexto (Dispatchers) • Bloqueia a thread • Recomendado para funções main e testes • para testes recomenda-se também o runBlockingTest
  12. Escopos • GlobalScope ◦ Usado para coroutines que vão executar

    durante toda a aplicação (tempo de vida da coroutine == tempo de vida da app) ◦ Não são cancelados prematuramente ◦ Não recomendado usar con launch e async
  13. Escopos • CoroutineScope ◦ Ideal para usar com launch e

    async ◦ Pode ser cancelado quando precisar ◦ No Android: ▪ LifecycleScope para Fragment e Activity ▪ ViewModelScope para ViewModel
  14. withContext • Usado para trocar de contexto • Exemplo: fazer

    uma requisição no servidor e o resultado precisa ser passado em uma LiveData
  15. coroutineStart • Define quando começar uma coroutine ◦ Default: usado

    quando não passamos parâmetro no async e launch ◦ Lazy: não inicia a coroutines até chamarmos o método start ◦
  16. Funções úteis • delay: espera pelo tempo determinado sem bloquear

    a thread • withTimeout: estabelece tempo máximo para executar o código, porém se der timeout irá solicitar uma exception (TimeoutCancellationException) • withTimeoutOrNull: não solicita exception e se der timeout irá retornar null.
  17. Muito Obrigado Se tiver alguma dúvida ou sugestão, pode falar

    comigo. /manuelernest0 @manuelernest0 @manuelernest0