escrito de forma secuencial ≻ Varias corrutinas - 1 hilo ◦ El número de hilos concurrentes es muy limitado ◦ El número de corrutinas concurrentes casi infinito
◦ Pueden suspender la ejecución ◦ Devuelven la ejecución a la corrutina cuando terminan ≻ Las corrutinas son el lugar seguro donde las funciones de suspensión (normalmente) no bloquearán el hilo actual.
userService.doLogin... val currentFriends = suspended { userServi... val finalUser = user.copy(friends = curren... toast("User ${finalUser.name} has ${finalU... progress.visibility = View.GONE } DEPENDE Se ejecutará en el hilo principal?
Dispatcher: especifica los hilos donde la corrutina se puede ejecutar ≻ El dispatcher se puede proveer ◦ Explícitamente ◦ Mediante un Scope de Corrutina (lo vemos después)
userService.doLogin... val currentFriends = suspended { userServi... val finalUser = user.copy(friends = curren... toast("User ${finalUser.name} has ${finalU... progress.visibility = View.GONE } ¿Y qué ocurre con la función de suspensión?
assertEquals(0, res) } ≻ Bloquea el hilo principal para ejecutar las corrutinas ≻ Casi nunca debería ser usado. Solo... ◦ Para testing, para llamar y testear funciones de suspensión
llamada no bloquea la corrutina superior, sino que empieza a ejecutarse en segundo plano ◦ Esto puede modificarse usando el argumento start ≻ Devuelve un objeto deferred Deferred (que extiende Job) ≻ Cuando se llama await, entonces bloquea