Kotlin runBlocking: 非コルーチンの世界をコルーチン コードで橋渡しする
 
Kotlin の runBlocking() 関数は、main スレッドをブロックするサスペンド関数です。 これは、同期コードと非同期コードの間のブリッジを作成するのに役立ちます。
この記事では、Kotlin runBlocking() とさまざまなシナリオでのその使用法について学びます。
Kotlin の runBlocking 関数
Kotlin の delay() 関数について聞いたことがあるかもしれません。 delay() 関数は、コルーチンを一時停止し、特定の時間遅らせます。
ただし、スレッド全体をブロックするわけではありません。 これは、delay() 関数を使用する場合でも、UI の変更などの他の操作を実行できることを意味します。
一方、runBlocking() 関数は、完了するまでスレッド全体をブロックします。 したがって、コンパイラは、runBlocking() コードを含むスレッドが完了するまで、他に何も実行しません。
Kotlin runBlocking() 関数によって起動された新しいスレッドは、main スレッドから起動されます。
これを理解するために、2つのコード例を見てみましょう。 最初のコードでは、GlobalScope.launch() で delay() 関数を使用します。 2 番目の例では、Kotlin の runBlocking() 関数で使用します。
GlobalScope.launch() で delay() を使用する
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()
    }
}
このようなコードを Android Studio で実行すると、タグ "Not Global Scope" が実行されます。 タグ "Global Scope" メッセージは、5 秒の遅延で実行されます。
これは、遅延があるだけであることを意味しますが、操作は引き続き実行されます。 したがって、スレッドは完全にはブロックされません。
Kotlin runBlocking() で delay() を使用する
前に見たように、GlobalScope.launch() で delay() 関数を使用すると、スレッド全体がブロックされません。
しかし、Kotlin runBlocking で使用すると、スレッドは runBlocking コードのすべての関数が実行されるまでブロックされます。 同じことを示す例を次に示します。
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")
    }
}
このコードを使用すると、タグ "Post using run blocks" が最後に実行されます。 その理由は、runBlocking コード全体が実行されるまで、すべての実行が停止されるためです。
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