O que é Coroutine em Kotlin?
Coroutines são o mecanismo do Kotlin para lidar com programação assíncrona de forma simples e eficiente. Em vez de usar callbacks aninhados ou threads pesadas, você escreve código assíncrono que parece sequencial — fácil de ler, fácil de manter.
Pense nas coroutines como “threads leves”. Você pode rodar milhares delas sem estourar a memória, porque elas não criam threads do sistema operacional — são gerenciadas pelo próprio Kotlin.
Por que usar coroutines?
O problema clássico de código assíncrono é o tal do “callback hell”. Coroutines resolvem isso permitindo que você escreva código que parece síncrono, mas executa de forma assíncrona por baixo dos panos.
Exemplo básico
import kotlinx.coroutines.*
fun main() = runBlocking {
println("Início")
launch {
delay(1000)
println("Coroutine finalizada!")
}
println("Fazendo outras coisas...")
delay(1500)
println("Fim")
}
Saída:
Início
Fazendo outras coisas...
Coroutine finalizada!
Fim
O launch cria uma nova coroutine, e o delay suspende a execução sem bloquear a thread. Enquanto uma coroutine tá esperando, outras podem rodar tranquilamente.
Conceitos fundamentais
- CoroutineScope: define o ciclo de vida das coroutines
- launch: inicia uma coroutine que não retorna valor
- async: inicia uma coroutine que retorna um resultado
- suspend: marca uma função que pode ser suspensa
- Dispatchers: controlam em qual thread a coroutine vai rodar
Exemplo com chamada de rede simulada
import kotlinx.coroutines.*
suspend fun buscarDados(): String {
delay(2000) // Simula uma chamada de rede
return "Dados carregados com sucesso"
}
fun main() = runBlocking {
println("Buscando dados...")
val resultado = buscarDados()
println(resultado)
}
Quando usar?
Coroutines são essenciais para operações de I/O (chamadas de rede, banco de dados, leitura de arquivos), processamento em background e qualquer tarefa que não deveria travar a interface do usuário. No Android, são praticamente obrigatórias hoje em dia.