Entradas

Mostrando entradas de julio, 2022

Gestión de la ejecución de las corrutinas

TL; DR Lo que se ejecuta en una corrutina se ejecuta en un hilo. Android decide si lo pone todo en un hilo, o en varios, o si crea o reutiliza hilos. Las corrutinas son concurrentes entre sí porque son hilos y los hilos son concurrentes entre sí. Cuando dos hilos se ejecutan a la par, si imprimimos logs desde cada uno de ellos, estos saldrán desordenados porque no se pueden imprimir solapados ( duh! ). "¿Cuán concurrentes son las corrutinas?" o "¿por qué sale desordenado el código?" son las preguntas que te han traído aquí. Asíncrono y concurrente son cosas distintas (podéis leer esto mejor en este artículo de Víctor Gómez de Juan ). Asincronía: el código en un hilo es síncrono, es decir, una línea se ejecuta después de la otra, pero con las corrutinas (al igual que con los callbacks ) el código de la corrutina no se ejecuta inmediatamente después de lanzarla. Lanzar una corrutina no significa ejecutarla inmediatamente, significa que le decim...

async()

El constructor de corrutinas async() sirve para lanzar corrutinas de las cuales necesitamos el resultado , pero permitiéndonos indicar cuándo queremos recuperarlo (es decir, sin suspender la corrutina actual hasta que sea necesario). async() FUNCIONA EXACTAMENTE IGUAL QUE launch() : Android lo ejecuta asíncronamente cuando él lo disponga y su ejecución es concurrente a lo que suceda en otros hilos ( Gestión de la ejecución de las corrutinas ). La peculiaridad que tiene es que nos permite solicitar el resultado de la corrutina mediante su job . Al igual que launch() , async() devuelve un Job , pero este es de tipo Deferred<T> . Deferred<T> tiene como particularidad la función de suspensión await() , que suspende la corrutina en la que ha sido llamado hasta que finaliza la ejecución de async() y obtenemos su resultado ( <T> ). Esto quiere decir que, para cuando llamemos a await() , si el resultado aún no ha sido calculado, la corrutina en la que se hace la llam...