※ソース記事はこちら
このチュートリアルでは、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のデバッガーを使うことで、自分のコードをデバッグするためにそれぞれのコルーチンを詳しく調べることができる。
