※ソース記事はこちら
このチュートリアルでは、IntelliJ IDEAを使ってKotlin Flowを作り、デバッグする方法をデモする。
このチュートリアルは、読者がコルーチンとKotlin Flowの概要を事前の知識を持つことを想定している。
デバッグはkotlinx-coroutines-core
バージョン1.3.8以上で動作する。
Kotlin Flowの作成
遅いエミッターと遅いコレクタを持つKotlin flowを次のように作成する。
- IntelliJ IDEAでKotlinプロジェクトを開く。プロジェクトが無い場合は、新規作成する。
-
src/main/kotlin
内のmain.kt
を開く。
src
ディレクトリには、Kotlinソースファイルとリソースが含まれている。main.kt
ファイルには、Hello World!
を出力するサンプルコードが含まれている。 - 3つの数字のflowを返却する
simple()
関数を作る。- delay関数を使い、CPUを消費するブロッキングコードの真似をする。これはスレッドをブロックすることなく、100msの間、コルーチンをsuspendする。
-
for
ループ内で、emit関数を使い、値を生成する。
import kotlinx.coroutines.* import kotlinx.coroutines.flow.* import kotlin.system.* fun simple(): Flow<Int> = flow { for (i in 1..3) { delay(100) emit(i) } }
-
main
関数内のコードを次のように変更する。- コルーチンをラップするためにrunBlockingブロックを使う。
- collect関数を使い、放出された値を収集する。
- delay関数を使い、CPUを消費するブロッキングコードの真似をする。これはスレッドをブロックすることなく、300msの間、コルーチンをsuspendする。
- flowから収集された値をprintln※ソース記事はこちら
このチュートリアルでは、IntelliJ IDEAを使ってKotlin Flowを作り、デバッグする方法をデモする。
このチュートリアルは、読者がコルーチンとKotlin Flowの概要を事前の知識を持つことを想定している。
デバッグはkotlinx-coroutines-core
バージョン1.3.8以上で動作する。
Kotlin Flowの作成
遅いエミッターと遅いコレクタを持つKotlin flowを次のように作成する。
- IntelliJ IDEAでKotlinプロジェクトを開く。プロジェクトが無い場合は、新規作成する。
-
src/main/kotlin
内のmain.kt
を開く。
src
ディレクトリには、Kotlinソースファイルとリソースが含まれている。main.kt
ファイルには、Hello World!
を出力するサンプルコードが含まれている。 - 3つの数字のflowを返却する
simple()
関数を作る。- delay関数を使い、CPUを消費するブロッキングコードの真似をする。これはスレッドをブロックすることなく、100msの間、コルーチンをsuspendする。
-
for
ループ内で、emit関数を使い、値を生成する。
import kotlinx.coroutines.* import kotlinx.coroutines.flow.* import kotlin.system.* fun simple(): Flow<Int> = flow { for (i in 1..3) { delay(100) emit(i) } }
-
main
関数内のコードを次のように変更する。- コルーチンをラップするためにrunBlockingブロックを使う。
- collect関数を使い、放出された値を収集する。
- delay関数を使い、CPUを消費するブロッキングコードの真似をする。これはスレッドをブロックすることなく、300msの間、コルーチンをsuspendする。
- flowから収集された値をprintln関数を使い、出力する。
fun main() = runBlocking { simple() .collect { value -> delay(300) println(value) } }
-
プロジェクトのビルド
をクリックすることで、コードをビルドする。
コルーチンのデバッグ
-
emit()
関数が呼び出される行にブレークポイントを設定する。
- 画面の上部の実行構成の隣にある
デバッグ
をクリックすることで、デバッグモードでコードを実行する。
デバッグ
ツールウィンドウが現れる。 -
デバッグ
ツールウィンドウ内の再開
をクリックすることで、デバッガーセッションを再開する。プログラムは同じブレークポイントで停止する。
現在、flowは二番目の値を放出している。
並列に実行するコルーチンの追加
-
src/main/kotlin
内のmain.kt
を開く。 - エミッターとコレクターを並列に実行するようにコードを強化する。
-
buffer関数呼び出しを追加し、エミッターとコレクターを並列で動作するようにする。
buffer
は放出された値を格納し、別のコルーチンでflowのコレクターを実行する。
fun main() = runBlocking<Unit> { simple() .buffer() .collect { value -> delay(300) println(value) } }
-
buffer関数呼び出しを追加し、エミッターとコレクターを並列で動作するようにする。
-
プロジェクトのビルド
をクリックすることで、コードをビルドする。
二つのコルーチンを持つKotlin flowのデバッグ
-
println(value)
に新しいブレークポイントを設定する。 - 画面の上部の実行構成の隣にある
デバッグ
をクリックすることで、デバッグモードでコードを実行する。
デバッグ
ツールウィンドウが現れる。
コルーチン
タブ内に、並列に実行している二つのコルーチンを見ることができる。buffer
関数のために、flowのコレクターとエミッターが別のコルーチンで実行されている。buffer
関数はflowから放出された値をバッファリングする。エミッターのコルーチンはRUNNING
状態を持ち、コレクターのコルーチンはSUSPENDED
状態を持つ。 -
デバッグ
ツールウィンドウ内の再開
をクリックすることで、デバッガーセッションを再開する。
現在は、コレクターのコルーチンはRUNNING
状態を持ち、一方エミッターのコルーチンはSUSPENDED
状態を持つ。(※emit
のブレークポイントではcoroutine2がACTIVEになり、println(value)
のブレークポイントではcoroutine1がACTIVEになる)
IntelliJ IDEAのデバッガーを使うことで、自分のコードをデバッグするためにそれぞれのコルーチンを詳しく調べることができる。