Cómo llamar a una función con retardo en Kotlin: guía completa con código

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Por qué lo necesita ahora mismo

\n

Imagine: está escribiendo una aplicación y necesita mostrar una notificación al usuario 5 segundos después de hacer clic en un botón. O realizar una solicitud al servidor solo 2 segundos después de que el usuario haya terminado de escribir texto. O simplemente hacer una animación bonita con retardo. Sin saber cómo llamar a una función con retardo en Kotlin, no llegará a ninguna parte.

\n

Esta pregunta es una de las más populares en Stack Overflow (¡miles de visitas!), y no es para menos. En Kotlin hay hasta 4 formas de hacer una llamada retrasada, y cada una es adecuada para su situación. En este artículo las analizaremos todas: desde el simple delay() en corrutinas hasta el clásico Handler para Android. Aprenderá qué método elegir y por qué, y lo más importante, verá código funcional que puede copiar directamente en su proyecto.

\n\n

Forma 1: Corrutinas y delay() (moderna y preferida)

\n

Esta es la forma más elegante y recomendada en el Kotlin moderno. Las corrutinas son hilos ligeros que no bloquean el hilo principal. El método delay() suspende la corrutina durante el tiempo especificado y luego la reanuda.

\n

Para trabajar con corrutinas, debe agregar la dependencia en build.gradle.kts:

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

Y así es como se ve en el código:

\n
import kotlinx.coroutines.*\n\nfun main() = runBlocking {\n    println("Inicio: ${System.currentTimeMillis()}")\n\n    // Iniciamos una corrutina con retardo\n    launch {\n        delay(3000L) // esperamos 3 segundos\n        println("Han pasado 3 segundos: ${System.currentTimeMillis()}")\n        myDelayedFunction() // llamamos a la función deseada\n    }\n\n    println("Esperando... (esto se ejecutará inmediatamente)")\n}\n\nfun myDelayedFunction() {\n    println("¡Función ejecutada!")\n}
\n

Importante: delay() es una función suspensiva (suspend function). Solo se puede llamar dentro de una corrutina u otra función suspend. Si intenta llamar a delay() fuera de una corrutina, el compilador dará un error.

\n\n

Cómo hacer una llamada retrasada en Android con corrutinas

\n

En el desarrollo de Android, las corrutinas son el estándar de facto. Aquí hay un ejemplo 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        // Después de 2 segundos mostrar un toast\n        scope.launch {\n            delay(2000L)\n            showToast("¡Han pasado 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() // cancelamos todas las tareas al destruir la Activity\n    }\n}
\n

Tenga en cuenta: usamos Dispatchers.Main para trabajar con la UI. Y es obligatorio cancelar el scope en onDestroy() para evitar fugas de memoria.

\n\n

Forma 2: Handler y postDelayed() (clásico de Android)

\n

Si está escribiendo para Android y no quiere (o no puede) usar corrutinas, el viejo y confiable Handler sigue funcionando. Este método era popular antes de la era de las corrutinas.

\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