Función de suspensión en las rutinas de Kotlin

Requisito previo: Kotlin Coroutines en Android

El equipo de Kotlin define las corrutinas como » subprocesos ligeros «. Son una especie de tareas que los subprocesos reales pueden ejecutar. Las rutinas se agregaron a Kotlin en la versión 1.3 y se basan en conceptos establecidos de otros lenguajes. Las rutinas de Kotlin presentan un nuevo estilo de concurrencia que se puede usar en Android para simplificar el código asincrónico.

La documentación oficial dice que las rutinas son subprocesos ligeros. Por ligero, significa que la creación de rutinas no asigna nuevos subprocesos. En su lugar, utilizan grupos de subprocesos predefinidos y programación inteligente con el propósito de qué tarea ejecutar a continuación y qué tareas más adelante .

Función de suspensión en Kotlin

La función de suspensión es una función que se puede iniciar, pausar y reanudar. Uno de los puntos más importantes para recordar acerca de las funciones de suspensión es que solo se les permite llamarlas desde una rutina u otra función de suspensión. A continuación se muestra un ejemplo, en el que hemos intentado llamar a la función desde fuera de la corrutina.

Kotlin

// sample kotlin program to show use of delay function
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
          
        // will throw a error
        delay(1000L)
          
        GlobalScope.launch{
         // delay function (a suspend function) must called within coroutine
         // or another suspend function
        } 
    }
}

Como hemos llamado a la función de retraso desde fuera de la corrutina, arrojará el siguiente error:

On hovering over the delay function we can see the error.

Función de retardo

Se representa como , es una función de suspensión que retrasa la rutina durante un tiempo determinado sin bloquear un hilo y la reanuda después de un tiempo específico. Cuando agregamos la palabra clave suspender en la función, todas las cooperaciones se realizan automáticamente por nosotros. No tenemos que usar when o cambiar de caso para cambiar de una función a otra. Tomemos un ejemplo de función de suspensión como:

Kotlin

// arbitrary do task function for explanation
suspend fun dotask(request: Request): Response
{
  // perform the task
}

Aunque parece que solo un argumento ha pasado a funcionar, internamente hay dos argumentos. Internamente, el compilador lo convierte en otra función sin la palabra clave suspend con un parámetro adicional del tipo Continuation<T> como se muestra a continuación:

Kotlin

// internal conversion of suspend function dotask()
fun dotask(request: Request, continuation: Continuation)...

La forma en que las funciones de suspensión se comunican entre sí es con objetos de continuación. Una continuación es solo una interfaz de devolución de llamada genérica con información adicional, que se ve a continuación (tomada del código fuente de Kotlin):

Kotlin

// Continuation interface structure
public interface Continuation<in T>
{
  public val context: CoroutineContext
  public fun resumeWith(result: Result<T>)
}
  • context será el CoroutineContext que se usará en esa continuación.
  • resumeWith reanuda la ejecución de la rutina con un Result, que puede contener un valor que es el resultado del cálculo que provocó la suspensión o una excepción.

Nota : desde Kotlin 1.3 en adelante, también puede usar las funciones de extensión resume(value: T) y resumeWithException(exception: Throwable), que son versiones especializadas de la llamada resumeWith .

Las dos funciones de extensión de resumeWith están dadas por:

  1. diversión <T> Continuación<T>.resume(valor: T)
  2. diversión <T> Continuación<T>.resumeWithException(excepción: Throwable)

Podemos ver las dos funciones de extensión que se pueden usar para reanudar las rutinas con un valor de retorno o con una excepción si ocurrió un error mientras la función estaba suspendida. De esta manera, una función podría iniciarse, pausarse y reanudarse con la ayuda de Continuación . Solo tenemos que usar la palabra clave suspender .

Kotlin

// Kotlin Program to demonstrate use of suspend function
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
          
          GlobalScope.launch{
          val networkCallAnswer==doNetworkCall()
          Log.d("Main-Activity,networkCallAnswer)
        } 
    }
      
    suspend fun doNetworkCall():String {
    delay(2000L);
    return "Network Call Answer"
    }               
}

Obtenemos la salida del registro después de un retraso de 2 segundos, ya que hemos llamado desde una corrutina, tenemos que hacer que funcione como suspensión.

Publicación traducida automáticamente

Artículo escrito por lavishgarg26 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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