Kotlin runBlocking: uniendo el mundo sin Coroutine con el código de Coroutine

Kailash Vaviya 20 junio 2023
Kotlin runBlocking: uniendo el mundo sin Coroutine con el código de Coroutine

La función runBlocking() de Kotlin es una función de suspensión que bloquea el hilo principal. Ayuda a crear un puente entre el código sincrónico y asincrónico.

En este artículo, aprenderemos sobre Kotlin runBlocking() y sus usos en diferentes escenarios.

la función runBlocking en Kotlin

Es posible que haya oído hablar de la función delay() en Kotlin. La función delay() suspende la rutina y la retrasa por un tiempo específico.

Sin embargo, no bloquea todo el hilo. Significa que cuando usamos la función retraso (), aún podemos realizar otras operaciones como hacer cambios en la interfaz de usuario.

Por otro lado, la función runBlocking() bloquea un hilo completo hasta su finalización. Por lo tanto, el compilador no ejecutará nada más hasta que se complete el hilo con el código runBlocking().

El nuevo hilo lanzado por la función runBlocking() de Kotlin se lanza desde el hilo principal.

Para entender esto, veamos dos códigos de ejemplo. En el primer código, usaremos la función delay() en GlobalScope.launch(). Y en el segundo ejemplo, lo usaremos en la función runBlocking() de Kotlin.

Utilice delay() en GlobalScope.launch()

package com.example.mycoroutines

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

class MainActivity : AppCompatActivity() {
    val TAG:String="This is Main Activity"
    override fun myFunc(savedInstanceState: Bundle?) {
        super.myFunc(savedInstanceState)
        setContentView(R.layout.activity_main)
        GlobalScope.launch(Dispatchers.Main) {
            delay(5000)
            Log.d(TAG,"Global Scope")
            Toast.makeText(applicationContext,"Thread executed in global scope",Toast.LENGTH_SHORT).show()
        }
        Log.d(TAG,"Not Global Scope")
        Toast.makeText(applicationContext,"Thread executed is not in Global Scope",Toast.LENGTH_SHORT).show()
    }
}

Cuando ejecuta dicho código en Android Studio, se ejecuta la etiqueta "Not Global Scope". El mensaje de la etiqueta "Alcance global" se ejecuta entonces con un retraso de 5 segundos.

Significa que solo hay un retraso, pero las operaciones aún se realizan. Por lo tanto, el hilo no está bloqueado por completo.

Usa retraso() en Kotlin runBlocking()

Como se vio anteriormente, el hilo completo no se bloquea cuando usamos la función delay() en GlobalScope.launch().

Pero cuando lo usamos en Kotlin runBlocking, el hilo se bloquea hasta que se ejecutan todas las funciones del código runBlocking. Aquí hay un ejemplo para demostrar lo mismo.

package com.example.mycoroutines

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

class MainActivity : AppCompatActivity() {
    val TAG:String="This is Main Activity"
    override fun myFunc(savedInstanceState: Bundle?) {
        super.myFunc(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.d(TAG, "Prior using run blocking")
            runBlocking 
              {
              Log.d(TAG,"Entered run-blocking")
              delay(3000)

              Log.d(TAG,"Run-blocking started")
              Log.d(TAG,"Run-blocking ended")
            }
        Log.d(TAG,"Post using run blocking")
    }
}

Cuando usamos este código, la etiqueta "Publicar usando bloqueo de ejecución" se ejecuta en último lugar. La razón es que todas las ejecuciones se detienen hasta que se ejecuta todo el código runBlocking.

Kailash Vaviya avatar Kailash Vaviya avatar

Kailash Vaviya is a freelance writer who started writing in 2019 and has never stopped since then as he fell in love with it. He has a soft corner for technology and likes to read, learn, and write about it. His content is focused on providing information to help build a brand presence and gain engagement.

LinkedIn