Coroutines para Android simplificado | Federico Puy | Octubre de 2020

Como sugiere su nombre, lo hacen Yfunciona de nuevo suspender en algún momento de la ejecución de la rutina, y luego, cuando el resultado esté listo, reanude la ejecución de la función.

Por ejemplo, para implementar una clase que realiza una solicitud de API simple usando devoluciones de llamada:

Esta implementación, usando suspender las funciones se pueden escribir como:

Ambos tienen la misma funcionalidad, pero el otro es mucho más simple y más legible porque parece ejecutarse de forma secuencial, aunque se está ejecutando una operación asincrónica.

Hay varias cosas a considerar:

  • Funciones de pausa Solo puede ser realizado dentro de otra rutinao dentro de otra función de suspensión.

Define una serie de reglas y configuraciones que las definen cómo y dónde se ejecutará el programa.

Dónde -> Despachadores

Si ha utilizado Rx antes, se puede comparar con los programadores. Ellos definen el hilo en el que se ejecutará la rutina. Algunos ejemplos son:

  • Principal -> usado Hilo de la interfaz de usuario. En Rx es similar AndroidSchedulers.MainThread ()

Cómo -> Constructores ordinarios

Podemos identificar diferentes constructores según lo que necesitemos hacer, o incluso crear el nuestro. Los que ya existen son:

  • runBlocking: Usualmente se usa para pruebas porque realiza tareas en segundo plano de forma sincrónica, evitando completar la prueba antes de que finalice la tarea en segundo plano. Normalmente no lo usa en código de producción. Más sobre eso más tarde.
  • Tenga en cuenta también que lanzamiento devuelve un Trabajo objeto.

Básicamente es una tarea que se ejecuta en segundo plano y se puede interpretar como acción, pags ciclo vital se pone destruido al finalizar.

Incluso puede crear una jerarquía con los padres y el trabajo infantil, por lo que cuando cancela a un padre, los hijos se eliminan.

Esto nos permite controlar el ciclo de vida de coroutin de un lugar único.

Podemos utilizar tareas para iniciar varias operaciones:

Job.unir

Bloquea el programa asociado con esta tarea hasta que completa todas las tareas secundarias.

Job.cancel

Cancela todo trabajo infantil.

asincrónico

Se utiliza para iniciar un proceso que debe obtener un resultado (por ejemplo, una llamada a la API). Este resultado está representado por una instancia de tipo Diferido (promete que devolverá el resultado en el futuro), y debemos usar Espere ganancia.

Todos los coutins deben correr por dentro y CoroutineScope. Esta gama define el ciclo de vida de las zanahorias a través de su Trabajo.

En caso de interferencia trabajo rango, todos los avisos dentro de este rango también serán cancelados.

Los rangos también nos permiten definir Remitente sobre el que correrá la carintia. Por ejemplo:

  • Alcance global -> se usa para zanahorias que deberían continuar ejecutándose incluso después de la destrucción de la actividad / fragmento en el que se ejecuta. En otras palabras, continuarán ejecutándose mientras la aplicación lo haga.
  1. Remitente

Cuando encadenamos Despachadores. Principal + tareacombinamos sus contextos.

Entonces podemos usar comienzo {} en cualquier lugar de nuestro Activity / ViewModel para ejecutar una rutina.

IMPORTANTE -> No olvides anulación tarea en onDestroy (), onCleared () o donde sea necesario para que sea posible Evita pérdidas de memoria.

A veces es posible que necesitemos cambiar el contexto en el que se ejecuta la corrutina temporalmentepara que podamos tomar una acción específica.

Por ejemplo, para este caso particular, establecemos Despachadores sea ​​nuestro despachador predeterminado. Sin embargo, necesitamos realizar una tarea de uso intensivo de la CPU para la cual Despachadores. Defecto es más apropiado.

Mediante el uso withContext, podemos cambiar temporalmente contexto de rutina.

Supongamos que queremos probar la siguiente función:

Ya que refreshTitle Yippee suspender función, Kotlin no sabrá cómo hacer esto dentro de la prueba a menos que lo hagamos desde otra corrutina o función de suspensión, y aparecerá el siguiente error:

«La función de pausa refreshTitle sólo debe invocarse desde una rutina u otra función de pausa».

El ejecutor de pruebas no tiene idea de cómo ejecutar la corrutina, por lo que no podemos hacer una prueba para que también sea una función de pausa.

Otra alternativa sería utilizar comienzo ()y usa un CoroutineScope, al igual que hacemos con el procedimiento normal. El problema con este enfoque es que necesitamos que la llamada asincrónica se complete antes de que se complete la prueba; de lo contrario, la prueba siempre fallará.

Entonces, ¿cómo se le dice a una prueba que espere a que un proceso complete un proceso antes de cerrar el resultado?

Mediante el uso runBlockingTest (), una función que bloquea la ejecución del hilo cuando se llama a la función de pausa. Esto garantizará que el resultado de la llamada asincrónica finalice antes de que se realice la prueba.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *