LoginSignup
2
2

More than 1 year has passed since last update.

【Coroutinesガイド】IntelliJ IDEAを使ったFlowのデバッグ - チュートリアル

Posted at

※ソース記事はこちら
このチュートリアルでは、IntelliJ IDEAを使ってKotlin Flowを作り、デバッグする方法をデモする。
このチュートリアルは、読者がコルーチンKotlin Flowの概要を事前の知識を持つことを想定している。

デバッグはkotlinx-coroutines-coreバージョン1.3.8以上で動作する。

Kotlin Flowの作成

遅いエミッターと遅いコレクタを持つKotlin flowを次のように作成する。

  1. IntelliJ IDEAでKotlinプロジェクトを開く。プロジェクトが無い場合は、新規作成する。
  2. src/main/kotlin内のmain.ktを開く。
    srcディレクトリには、Kotlinソースファイルとリソースが含まれている。main.ktファイルには、Hello World!を出力するサンプルコードが含まれている。
  3. 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)
        }
    }
    
  4. 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を次のように作成する。

  1. IntelliJ IDEAでKotlinプロジェクトを開く。プロジェクトが無い場合は、新規作成する。
  2. src/main/kotlin内のmain.ktを開く。
    srcディレクトリには、Kotlinソースファイルとリソースが含まれている。main.ktファイルには、Hello World!を出力するサンプルコードが含まれている。
  3. 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)
        }
    }
    
  4. main関数内のコードを次のように変更する。
    • コルーチンをラップするためにrunBlockingブロックを使う。
    • collect関数を使い、放出された値を収集する。
    • delay関数を使い、CPUを消費するブロッキングコードの真似をする。これはスレッドをブロックすることなく、300msの間、コルーチンをsuspendする。
    • flowから収集された値をprintln関数を使い、出力する。
    fun main() = runBlocking {
        simple()
            .collect { value ->
                delay(300)
                println(value)
            }
    }
    
  5. プロジェクトのビルドをクリックすることで、コードをビルドする。
    flow1

コルーチンのデバッグ

  1. emit()関数が呼び出される行にブレークポイントを設定する。
    flow2
  2. 画面の上部の実行構成の隣にあるデバッグをクリックすることで、デバッグモードでコードを実行する。
    flow3
    デバッグツールウィンドウが現れる。
    • フレームタブにはコールスタックが含まれている。
    • 変数タブには現在のコンテキスト内の変数が含まれている。それにより、flowから最初の値が放出されているのがわかる。
    • コルーチンタブには、実行中あるいはsuspendされたコルーチン情報が含まれている。
      flow4
  3. デバッグツールウィンドウ内の再開をクリックすることで、デバッガーセッションを再開する。プログラムは同じブレークポイントで停止する。
    flow5
    現在、flowは二番目の値を放出している。
    flow6

並列に実行するコルーチンの追加

  1. src/main/kotlin内のmain.ktを開く。
  2. エミッターとコレクターを並列に実行するようにコードを強化する。
    • buffer関数呼び出しを追加し、エミッターとコレクターを並列で動作するようにする。bufferは放出された値を格納し、別のコルーチンでflowのコレクターを実行する。
    fun main() = runBlocking<Unit> {
        simple()
            .buffer()
            .collect { value ->
                delay(300)
                println(value)
            }
    }
    
  3. プロジェクトのビルドをクリックすることで、コードをビルドする。

二つのコルーチンを持つKotlin flowのデバッグ

  1. println(value)に新しいブレークポイントを設定する。
  2. 画面の上部の実行構成の隣にあるデバッグをクリックすることで、デバッグモードでコードを実行する。
    flow7
    デバッグツールウィンドウが現れる。
    コルーチンタブ内に、並列に実行している二つのコルーチンを見ることができる。buffer関数のために、flowのコレクターとエミッターが別のコルーチンで実行されている。buffer関数はflowから放出された値をバッファリングする。エミッターのコルーチンはRUNNING状態を持ち、コレクターのコルーチンはSUSPENDED状態を持つ。
  3. デバッグツールウィンドウ内の再開をクリックすることで、デバッガーセッションを再開する。
    flow8
    現在は、コレクターのコルーチンはRUNNING状態を持ち、一方エミッターのコルーチンはSUSPENDED状態を持つ。(※emitのブレークポイントではcoroutine2がACTIVEになり、println(value)のブレークポイントではcoroutine1がACTIVEになる)
    IntelliJ IDEAのデバッガーを使うことで、自分のコードをデバッグするためにそれぞれのコルーチンを詳しく調べることができる。
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2