Programação Assíncrona em Kotlin: guia completo para iniciantes
\n\nOs aplicativos modernos cada vez mais exigem a execução de várias tarefas simultaneamente: carregar dados da rede, trabalhar com banco de dados, processar entrada do usuário. Na linguagem Kotlin, para isso, utiliza-se a programação assíncrona, baseada em corrotinas (coroutines). Esta é uma ferramenta poderosa e elegante que permite escrever código não bloqueante sem callbacks complexos.
\n\nNeste artigo, vamos abordar os fundamentos da programação assíncrona em Kotlin: o que são corrotinas, como usar launch, async e await, além de conhecer os dispatchers e o tratamento de erros. O material é voltado para desenvolvedores iniciantes que já conhecem o básico da sintaxe do Kotlin.
O que são corrotinas e para que servem?
\n\nUma corrotina é um fluxo de execução leve que pode ser pausado e retomado sem bloquear a thread principal. Diferente das threads tradicionais, as corrotinas não estão vinculadas a recursos do sistema e podem ser executadas em uma única thread, alternando entre si.
\n\nPrincipais vantagens das corrotinas:
\n- \n
- Leveza — é possível executar milhares de corrotinas sem consumo significativo de memória. \n
- Suspensão (suspend) — uma função pode "congelar" sua execução sem bloquear a thread. \n
- Concorrência estruturada — as corrotinas gerenciam automaticamente seu ciclo de vida. \n
- Simplicidade — o código parece síncrono, sem callbacks aninhados. \n
Para trabalhar com corrotinas, é necessário adicionar a dependência no build.gradle.kts:
dependencies {\n implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")\n}\n\nBlocos de construção principais: launch, async e suspend
\n\nFunção suspend
\n\nQualquer função que pode pausar a execução de uma corrotina é marcada com a palavra-chave suspend. Essas funções só podem ser chamadas dentro de uma corrotina ou de outra função suspend.
suspend fun fetchUserData(): String {\n delay(1000) // simulação de atraso\n return "User data loaded"\n}\n\nA função delay() é análoga ao Thread.sleep(), mas sem bloquear a thread.
launch — iniciar corrotina sem resultado
\n\nO builder launch inicia uma nova corrotina que não retorna resultado (retorna um Job). É usado para tarefas do tipo "inicie e esqueça".
import kotlinx.coroutines.*\n\nfun main() = runBlocking {\n launch {\n println("Corrotina 1 iniciada")\n delay(1000)\n println("Corrotina 1 concluída")\n }\n println("Thread principal continua trabalhando")\n}\n\nSaída:
\nThread principal continua trabalhando\nCorrotina 1 iniciada\nCorrotina 1 concluída\n\nObserve: runBlocking é usado apenas em exemplos didáticos ou em pontos de entrada (por exemplo, em main()). Em aplicações reais (Android, servidor), não é necessário utilizá-lo.
async e await — obtendo resultado
\n\nSe a corrotina deve retornar um resultado, usa-se o builder async. Ele retorna um objeto Deferred<T>, do qual o valor pode ser obtido com await().
fun main() = runBlocking {\n val deferredResult: Deferred<String> = async {\n delay(1500)\n "Resultado dos cálculos"\n }\n\n println("Aguardando resultado...")\n val result = deferredResult.await()\n println("Resultado obtido: $result")\n}\n\nSaída:
\nAguardando resultado...\nResultado obtido: Resultado dos cálculos\n\nCom async, é possível executar várias tarefas em paralelo:
Blogs
Book Recommendations
Leia também
Criar site em Python: Guia completo de Flask e Django
CQRS e Event Sourcing em Swift: Arquitetura para Projetos Complexos
Programação Assíncrona em Swift: Guia Completo para Iniciantes
Implantação de aplicação PHP em VPS: guia passo a passo do início ao fim
Perfilamento de código C++: encontrando gargalos na prática