Tengo una rutina muy simple que solo retrasa un poco y luego lo que quiero que haga es enviar comandos a la cola de mensajes de la interfaz de usuario. así que ejecute las dos últimas líneas en el subproceso de la interfaz de usuario. aquí está la rutina:
async{ delay(5000) doSomething() doAnotherThing() }Quiero que los dos últimos métodos doSomething() y doAnotherThing() se ejecuten en el subproceso de la interfaz de usuario. ¿Cómo se puede hacer esto? Por lo que he leído, el retraso (5000) se ejecutará automáticamente de forma asíncrona, pero ¿cómo hacer que el resto se ejecute en el subproceso de la interfaz de usuario? Para ser muy claro, estoy haciendo esto desde un objeto que se lanzó desde el hilo principal.
async crea una corrutina y se ejecuta en el contexto Coroutine, heredado de un CoroutineScope , se pueden especificar elementos de contexto adicionales con un argumento de contexto. Si el contexto no tiene ningún despachador ni ningún otro ContinuationInterceptor , entonces se usa Dispatchers.Default .
Si se utiliza Dispatchers.Default , cualquier función que invoque en el generador async se ejecutará de forma asíncrona. Para cambiar de contexto, puede usar la función withContext :
async { delay(5000) withContext(Dispatchers.Main) { // if we use `Dispatchers.Main` as a coroutine context next two lines will be executed on UI thread. doSomething() doAnotherThing() } } Si async se ejecuta en el contexto Dispatchers.Main , no necesita cambiar de contexto:
var job: Job = Job() var scope = CoroutineScope(Dispatchers.Main + job) scope.async { delay(5000) // suspends the coroutine without blocking UI thread // runs on UI thread doSomething() doAnotherThing() } Nota : async se usa principalmente para ejecuciones paralelas. Para comenzar, se utiliza un generador de launch de corrutina simple. Entonces puede reemplazar todas las funciones async en esos ejemplos en la función de launch . Además, para ejecutar la rutina con el generador async , debe llamar a la función await await() en el objeto Deferred que devuelve la función async . Aquí hay información adicional .