Por que você precisa disso agora
\nImagine: você está escrevendo um aplicativo e precisa mostrar uma notificação ao usuário 5 segundos após ele clicar em um botão. Ou executar uma requisição ao servidor apenas 2 segundos após o usuário terminar de digitar um texto. Ou simplesmente fazer uma animação bonita com atraso. Sem saber como chamar uma função com atraso em Kotlin, você não vai a lugar nenhum.
\nEsta é uma das perguntas mais populares no Stack Overflow (milhares de visualizações!), e não é à toa. Em Kotlin existem 4 maneiras de fazer uma chamada atrasada, e cada uma é adequada para uma situação diferente. Neste artigo, vamos abordar todas elas: desde o simples delay() em corrotinas até o clássico Handler para Android. Você aprenderá qual método escolher e por quê, e, mais importante, verá código funcional que pode copiar diretamente para o seu projeto.
Método 1: Corrotinas e delay() (moderno e preferível)
\nEsta é a maneira mais elegante e recomendada no Kotlin moderno. Corrotinas são threads leves que não bloqueiam a thread principal. O método delay() pausa a corrotina pelo tempo especificado e depois a retoma.
Para trabalhar com corrotinas, você precisa adicionar a dependência no build.gradle.kts:
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")\nE aqui está como fica no código:
\nimport kotlinx.coroutines.*\n\nfun main() = runBlocking {\n println("Início: ${System.currentTimeMillis()}")\n\n // Inicia uma corrotina com atraso\n launch {\n delay(3000L) // espera 3 segundos\n println("Passaram-se 3 segundos: ${System.currentTimeMillis()}")\n myDelayedFunction() // chama a função desejada\n }\n\n println("Aguardando... (isso será executado imediatamente)")\n}\n\nfun myDelayedFunction() {\n println("Função executada!")\n}\nImportante: delay() é uma função suspensiva (suspend function). Ela só pode ser chamada dentro de uma corrotina ou de outra função suspend. Se você tentar chamar delay() fora de uma corrotina, o compilador emitirá um erro.
Como fazer uma chamada atrasada no Android com corrotinas
\nNo desenvolvimento Android, as corrotinas são o padrão de facto. Aqui está um exemplo para Activity:
\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport kotlinx.coroutines.*\n\nclass MainActivity : AppCompatActivity() {\n\n private val scope = CoroutineScope(Dispatchers.Main + SupervisorJob())\n\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n setContentView(R.layout.activity_main)\n\n // Após 2 segundos, mostrar um toast\n scope.launch {\n delay(2000L)\n showToast("Passaram-se 2 segundos!")\n }\n }\n\n private fun showToast(message: String) {\n android.widget.Toast.makeText(this, message, android.widget.Toast.LENGTH_SHORT).show()\n }\n\n override fun onDestroy() {\n super.onDestroy()\n scope.cancel() // cancela todas as tarefas ao destruir a Activity\n }\n}\nObserve: usamos Dispatchers.Main para trabalhar com a UI. E é essencial cancelar o scope em onDestroy() para evitar vazamentos de memória.
Método 2: Handler e postDelayed() (clássico do Android)
\nSe você está desenvolvendo para Android e não quer (ou não pode) usar corrotinas, o bom e velho Handler ainda funciona. Este método era popular antes da era das corrotinas.
import android.os.Bundle\nimport android.os.Handler\nimport android.os.Looper\nimport androidx.appcompat.app.AppCompatActivity\n\nclass MainActivity : AppCompatActivity() {\n\n private val handler = Handler(Looper.getMainLooper())\n\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n setContentView(R.layout.activity_main)