Programación asíncrona en Kotlin: guía completa para principiantes

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

Programación asíncrona en Kotlin: guía completa para principiantes

\n\n

Las aplicaciones modernas cada vez requieren ejecutar múltiples tareas simultáneamente: cargar datos de la red, trabajar con bases de datos, procesar la entrada del usuario. En el lenguaje Kotlin, para esto se utiliza la programación asíncrona, basada en corrutinas (coroutines). Es una herramienta potente y elegante que permite escribir código no bloqueante sin callbacks complejos.

\n\n

En este artículo analizaremos los fundamentos de la programación asíncrona en Kotlin: qué son las corrutinas, cómo usar launch, async y await, y también conoceremos los despachadores y el manejo de errores. El material está dirigido a desarrolladores principiantes que ya conocen los fundamentos de la sintaxis de Kotlin.

\n\n

¿Qué son las corrutinas y para qué sirven?

\n\n

Una corrutina es un hilo de ejecución ligero que puede ser suspendido y reanudado sin bloquear el hilo principal. A diferencia de los hilos tradicionales (threads), las corrutinas no están vinculadas a recursos del sistema y pueden ejecutarse en un solo hilo, alternando entre sí.

\n\n

Principales ventajas de las corrutinas:

\n
    \n
  • Ligereza — se pueden ejecutar miles de corrutinas sin un consumo significativo de memoria.
  • \n
  • Suspensión (suspend) — una función puede "congelar" su ejecución sin bloquear el hilo.
  • \n
  • Concurrencia estructurada — las corrutinas gestionan automáticamente su ciclo de vida.
  • \n
  • Simplicidad — el código se ve como síncrono, sin callbacks anidados.
  • \n
\n\n

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

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

Componentes básicos: launch, async y suspend

\n\n

Función suspend

\n\n

Cualquier función que pueda suspender la ejecución de una corrutina se marca con la palabra clave suspend. Estas funciones solo se pueden llamar dentro de una corrutina u otra función suspend.

\n\n
suspend fun fetchUserData(): String {\n    delay(1000) // simulación de retardo\n    return "User data loaded"\n}
\n\n

La función delay() es un análogo de Thread.sleep(), pero sin bloquear el hilo.

\n\n

launch — iniciar una corrutina sin resultado

\n\n

El constructor launch inicia una nueva corrutina que no devuelve un resultado (devuelve un Job). Se utiliza para tareas del tipo "iniciar y olvidar".

\n\n
import kotlinx.coroutines.*\n\nfun main() = runBlocking {\n    launch {\n        println("Corrutina 1 iniciada")\n        delay(1000)\n        println("Corrutina 1 finalizada")\n    }\n    println("El hilo principal continúa trabajando")\n}
\n\n

Salida:

\n
El hilo principal continúa trabajando\nCorrutina 1 iniciada\nCorrutina 1 finalizada
\n\n

Tenga en cuenta: runBlocking se usa solo en ejemplos educativos o en puntos de entrada (por ejemplo, en main()). En aplicaciones reales (Android, servidor) no es necesario usarlo.

\n\n

async y await — obtención de un resultado

\n\n

Si una corrutina debe devolver un resultado, se utiliza el constructor async. Este devuelve un objeto Deferred<T>, del cual se puede obtener el valor mediante await().

\n\n
fun main() = runBlocking {\n    val deferredResult: Deferred<String> = async {\n        delay(1500)\n        "Resultado del cálculo"\n    }\n\n    println("Esperando resultado...")\n    val result = deferredResult.await()\n    println("Resultado obtenido: $result")\n}
\n\n

Salida:

\n
Esperando resultado...\nResultado obtenido: Resultado del cálculo
\n\n

Con async se pueden ejecutar varias tareas en paralelo:

\n\n


                
                

Blogs

Book Recommendations