Programación asíncrona en Kotlin: guía completa para principiantes
\n\nLas 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\nEn 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.
¿Qué son las corrutinas y para qué sirven?
\n\nUna 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\nPrincipales 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
Para trabajar con corrutinas, es necesario agregar la dependencia en build.gradle.kts:
dependencies {\n implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")\n}\n\nComponentes básicos: launch, async y suspend
\n\nFunción suspend
\n\nCualquier 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.
suspend fun fetchUserData(): String {\n delay(1000) // simulación de retardo\n return "User data loaded"\n}\n\nLa función delay() es un análogo de Thread.sleep(), pero sin bloquear el hilo.
launch — iniciar una corrutina sin resultado
\n\nEl constructor launch inicia una nueva corrutina que no devuelve un resultado (devuelve un Job). Se utiliza para tareas del tipo "iniciar y olvidar".
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\nSalida:
\nEl hilo principal continúa trabajando\nCorrutina 1 iniciada\nCorrutina 1 finalizada\n\nTenga 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.
async y await — obtención de un resultado
\n\nSi 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().
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\nSalida:
\nEsperando resultado...\nResultado obtenido: Resultado del cálculo\n\nCon async se pueden ejecutar varias tareas en paralelo:
Blogs
Book Recommendations
Leer también
Cómo eliminar la línea inferior de UINavigationBar: 3 métodos funcionales
Depuración de código Rust: guía completa de técnicas y herramientas
OAuth 2.0 y autorización JWT en Rust: guía paso a paso para principiantes
C++ en LeetCode: cómo resolver problemas y mejorar tus habilidades
Java para backend vs frontend: ¿qué elegir en 2024?