DEV Community

Cover image for Métodos Utilitários e de Execução no Kotlin: Trabalhando com Corrotinas
Alan Gomes for Comunidade Dev Space

Posted on

1

Métodos Utilitários e de Execução no Kotlin: Trabalhando com Corrotinas

1 – Introdução

Ao trabalhar com corrotinas no Kotlin, existem métodos utilitários e métodos de execução que ajudam a gerenciar tarefas assíncronas de forma eficiente. Esses métodos são ferramentas essenciais para controlar:

  • O tempo de execução das tarefas.
  • O contexto em que as tarefas são executadas.
  • O início e a sincronização de múltiplas corrotinas.

Neste artigo, exploraremos os métodos mais importantes, como withTimeout, withContext, launch, async, e outros, com exemplos práticos para entender como e quando usá-los.


2 – Métodos Utilitários

2.1 – withTimeout

  • O que é? Cancela a execução de um bloco de código se o tempo limite for atingido.
  • Quando usar? Para evitar que tarefas assíncronas fiquem presas indefinidamente.
  • Exemplo:
import kotlinx.coroutines.*

fun main() = runBlocking {
    try {
        withTimeout(1000) { // Tempo limite de 1 segundo
            delay(2000) // Simula uma tarefa longa
            println("Tarefa concluída!")
        }
    } catch (e: TimeoutCancellationException) {
        println("Tempo limite atingido! Tarefa cancelada.")
    }
}
Enter fullscreen mode Exit fullscreen mode

2.2 - withTimeoutOrNull

  • O que é? Semelhante ao withTimeout, mas em vez de lançar uma exceção, retorna null se o tempo limite for atingido.
  • Quando usar? Para evitar o uso de exceções e lidar com o timeout de forma mais controlada.
  • Exemplo:
import kotlinx.coroutines.*

fun main() = runBlocking {
    val resultado = withTimeoutOrNull(1000) { // Tempo limite de 1 segundo
        delay(2000) // Simula uma tarefa longa
        "Tarefa concluída!"
    }

    if (resultado == null) {
        println("Tempo limite atingido! Retornou null.")
    } else {
        println(resultado)
    }
}
Enter fullscreen mode Exit fullscreen mode

2.3 – withContext

  • O que é? Altera o contexto da corrotina (ex.: muda o dispatcher).
  • Quando usar? Para trocar o dispatcher de forma temporária dentro de uma corrotina.
  • Exemplo:
import kotlinx.coroutines.*

fun main() = runBlocking {
    println("Executando no Dispatcher Padrão: ${Thread.currentThread().name}")

    withContext(Dispatchers.IO) {
        println("Executando no Dispatcher IO: ${Thread.currentThread().name}")
    }

    println("De volta ao Dispatcher Padrão: ${Thread.currentThread().name}")
}
Enter fullscreen mode Exit fullscreen mode

2.4 – delay

  • O que é? Suspende a execução de uma corrotina por um período de tempo, sem bloquear a thread.
  • Quando usar? Para simular tarefas demoradas ou esperar por uma resposta.
  • Exemplo:
import kotlinx.coroutines.*

fun main() = runBlocking {
    println("Iniciando a tarefa...")
    delay(1000) // Suspende por 1 segundo
    println("Tarefa concluída!")
}
Enter fullscreen mode Exit fullscreen mode

2.5 – yield

  • O que é? Cede o contexto atual, permitindo que outras corrotinas sejam executadas.
  • Quando usar? Para melhorar a cooperação entre corrotinas e evitar bloqueios desnecessários.
  • Exemplo:
import kotlinx.coroutines.*

fun main() = runBlocking {
    launch {
        repeat(3) { i ->
            println("Corrotina 1 - Iteração $i")
            yield() // Cede o contexto
        }
    }

    launch {
        repeat(3) { i ->
            println("Corrotina 2 - Iteração $i")
            yield() // Cede o contexto
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

3 – Métodos de Execução

3.1 – launch

  • O que é? Cria uma nova corrotina e inicia sua execução imediatamente.
  • Quando usar? Quando você não precisa retornar um resultado da corrotina.
  • Exemplo:
import kotlinx.coroutines.*

fun main() = runBlocking {
    launch {
        println("Corrotina iniciada!")
        delay(1000)
        println("Corrotina finalizada!")
    }
}
Enter fullscreen mode Exit fullscreen mode

3.2 – async

  • O que é? Cria uma nova corrotina que retorna um valor (deferred).
  • Quando usar? Para tarefas assíncronas que retornam resultados.
  • Exemplo:
import kotlinx.coroutines.*

fun main() = runBlocking {
    val resultado = async {
        delay(1000)
        "Resultado calculado!"
    }

    println("Esperando o resultado...")
    println("Resultado: ${resultado.await()}")
}
Enter fullscreen mode Exit fullscreen mode

3.3 – runBlocking

  • O que é? Executa corrotinas em uma função bloqueante.
  • Quando usar? Apenas em casos específicos, como scripts pequenos ou para testes rápidos.
  • Exemplo:
import kotlinx.coroutines.*

fun main() = runBlocking {
    println("Iniciando runBlocking")
    delay(1000)
    println("Finalizando runBlocking")
}
Enter fullscreen mode Exit fullscreen mode

4 – Comparação: Métodos Utilitários vs. Métodos de Execução

Aspecto Métodos Utilitários Métodos de Execução
Função principal Controlar tempo, contexto e suspensão. Iniciar e gerenciar corrotinas.
Retorno de valor Geralmente, não retornam valores. Alguns retornam valores (ex.: async).
Exemplos principais withTimeout, delay, yield. launch, async, runBlocking.

5 – Conclusão

Os métodos utilitários e de execução são ferramentas indispensáveis no ecossistema de corrotinas do Kotlin. Eles permitem que você controle a execução assíncrona de maneira precisa, escalável e eficiente.

Resumo dos Métodos:

1. Utilitários:

  • Controle de tempo: withTimeout, withTimeoutOrNull.
  • Contexto: withContext.
  • Suspensão: delay, yield.

1. Execução:

  • launch para corrotinas que não retornam valores.
  • async para corrotinas que retornam resultados.
  • runBlocking para executar corrotinas em scripts ou testes simples.

No próximo artigo, exploraremos como testar corrotinas e fluxos de maneira eficiente com ferramentas nativas e bibliotecas como o Turbine.

Referência
Documentação oficial do Kotlin sobre corrotinas

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay