CoroutineScope - Ki-Kobayashi/Android-Wiki GitHub Wiki

🟩 コルーチンのスコープ

coroutineScope suspend 関数は CoroutineScope を作成し、指定された suspend ブロックを現在のスコープで呼び出します。
スコープは、LaunchedEffect() スコープから coroutineContext を継承します。

このスコープは、指定されたブロックとそのすべての子コルーチンが完了するとすぐに返されます。
RaceTracker アプリの場合、両方の参加者オブジェクトが run() 関数の実行を終了すると、返されます。

raceInProgress フラグを更新する前に playerOne と playerTwo の run() 関数の実行が完了するように、両方の起動ビルダーを coroutineScope ブロックでラップします。

🟨 LaunchedEffect : 監視している値が変化した時にコルーチンを作動させるやつ

LaunchedEffect(playerOne, playerTwo) {
    coroutineScope {
        launch { playerOne.run() }
        launch { playerTwo.run() }
    }
    raceInProgress = false
}

エミュレータまたは Android デバイスでアプリを実行します。次の画面が表示されます。
image

[Start] ボタンをクリックします。プレーヤー 2 はプレーヤー 1 よりも速く走行します。
レースが終了すると(両方のプレーヤーが 100% の進行状況に達すると)、[Pause] ボタンが [Start] ボタンに変わります。
[Reset] ボタンをクリックすると、レースをリセットしてシミュレーションを再実行できます。レースを次の動画で示します。
image

次の図に実行フローを示します。

image

LaunchedEffect() ブロックが実行されると、制御は coroutineScope{..} ブロックに移ります。
coroutineScope ブロックは、両方のコルーチンを同時に起動し、実行が完了するのを待ちます。
実行が完了すると、raceInProgress フラグが更新されます。

💡coroutineScope ブロックは、ブロック内のすべてのコードの実行が完了した後にのみ、実行を継続します。