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.")
}
}
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)
}
}
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}")
}
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!")
}
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
}
}
}
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!")
}
}
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()}")
}
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")
}
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.
Top comments (0)