Como chamar uma função com atraso em Kotlin: guia completo com código

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que você precisa disso agora

\n

Imagine: 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.

\n

Esta é 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.

\n\n

Método 1: Corrotinas e delay() (moderno e preferível)

\n

Esta é 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.

\n

Para trabalhar com corrotinas, você precisa adicionar a dependência no build.gradle.kts:

\n
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
\n

E aqui está como fica no código:

\n
import 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}
\n

Importante: 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.

\n\n

Como fazer uma chamada atrasada no Android com corrotinas

\n

No desenvolvimento Android, as corrotinas são o padrão de facto. Aqui está um exemplo para Activity:

\n
import 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}
\n

Observe: usamos Dispatchers.Main para trabalhar com a UI. E é essencial cancelar o scope em onDestroy() para evitar vazamentos de memória.

\n\n

Método 2: Handler e postDelayed() (clássico do Android)

\n

Se 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.

\n
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)                

Blogs

Book Recommendations