O que é launch em Kotlin?
O launch é um coroutine builder que inicia uma nova coroutine sem retornar resultado. Ele é do tipo “fire-and-forget” — você dispara a coroutine e segue em frente. Perfeito pra tarefas que precisam rodar em background mas não precisam devolver um valor.
O launch retorna um Job, que permite controlar o ciclo de vida da coroutine: cancelar, esperar terminar ou verificar o status.
Exemplo básico
import kotlinx.coroutines.*
fun main() = runBlocking {
val job = launch {
println("Coroutine iniciada")
delay(1000)
println("Coroutine finalizada")
}
println("Código principal continua...")
job.join() // Espera a coroutine terminar
}
Saída:
Código principal continua...
Coroutine iniciada
Coroutine finalizada
Controlando com Job
O Job retornado pelo launch oferece várias possibilidades:
import kotlinx.coroutines.*
fun main() = runBlocking {
val job = launch {
repeat(100) { i ->
println("Processando item $i")
delay(200)
}
}
delay(1000)
println("Cansou de esperar!")
job.cancel()
println("Job cancelado: ${job.isCancelled}")
}
Dispatchers
Você pode escolher em qual thread a coroutine vai rodar:
import kotlinx.coroutines.*
fun main() = runBlocking {
launch(Dispatchers.Default) {
println("CPU-intensivo em: ${Thread.currentThread().name}")
}
launch(Dispatchers.IO) {
println("Operação de I/O em: ${Thread.currentThread().name}")
}
}
Dispatchers.Default— tarefas pesadas de CPUDispatchers.IO— operações de entrada/saídaDispatchers.Main— thread principal (Android)
launch vs async
A diferença é simples: launch não retorna valor, async retorna. Se você precisa do resultado da coroutine, use async. Se é só pra executar algo no background, launch resolve.
// Não precisa do resultado? Use launch
launch { salvarNoLog("evento_123") }
// Precisa do resultado? Use async
val dados = async { buscarDados() }
println(dados.await())
launch é provavelmente o coroutine builder que você mais vai usar no dia a dia.