コルーチン (coroutine)
コルーチン (coroutine) は Kotlin が持っている 軽量な並行処理の仕組み です。🔹 簡単にいうと
「重い処理を待っている間もアプリを止めない仕組み」
たとえばデータベースアクセスやネットワーク通信は時間がかかりますよね?
もしそれをメインスレッドで実行すると画面がフリーズします。
コルーチンを使うと、時間のかかる処理を「中断」しながら待てるので、アプリは止まらず動き続けられます。
🔹 Java のスレッドとの違い
Java の Thread は重くて、たくさん作るとメモリや CPU を消費します。
Kotlin の Coroutine は「軽量スレッド」のようなもので、数千個以上同時に走らせても軽いです。
🔹 基本用語
suspend 関数
コルーチンの中でしか呼べない関数
実行中に「一時停止」して他の処理に CPU を渡せる
CoroutineScope
コルーチンの「入れ物」
例: GlobalScope, lifecycleScope, viewModelScope
launch / async
コルーチンを開始するための関数
launch → 戻り値なし
async → 戻り値(Deferred)あり
ポイント
1. Unit をキーにする
画面が表示されたとき「一度だけ」コルーチンを走らせたいとき。
→ 初期データのロードなどに便利。
LaunchedEffect(Unit) {
viewModel.loadData()
}
2. key を渡す
key が変わるたびに再実行される。
→ 依存する値が変わったら再ロードしたいときに使う。
LaunchedEffect(folderId) {
viewModel.loadNotes(folderId) // folderIdが変わるたびに実行
}
3. 直接 suspend 関数を呼べる
普通の @Composable では suspend fun は呼べない。
でも LaunchedEffect の中なら呼べるので、
ViewModel の suspend fun を安全に呼び出せる。
💡 よくある用途
画面表示時にデータをロード
パラメータが変わったときにAPIを呼び直す
Snackbarやアニメーションの表示制御
👉 まとめると:
LaunchedEffect = 「Composable のライフサイクルにくっついたコルーチン起動装置」
UIが生きている間だけコルーチンが動き、キーが変わると自動的にキャンセル・再起動される
1. 基本構造
LaunchedEffect(aaa) {
// 処理A
}
// 処理B
LaunchedEffect(aaa) の中は コルーチン です
その外(処理B)は 通常の Compose のコード です
2. 実行タイミング
処理B は、LaunchedEffect が呼ばれた瞬間に「普通に」実行されます
処理A は、LaunchedEffect によって 別のコルーチンとして非同期で開始 されます
つまり:
処理B が 先に同期的に実行される
その後、並行して 処理A がコルーチンで進行する
3. UI はどうなる?
処理A が重い処理でも、コルーチンなので UI スレッドをブロックしません
したがって UI は継続して描画され、ユーザーは止まらない画面を見られます
例えば delay(1000) を入れても、UI はフリーズせず「待っている間も描画更新」ができます
4. 簡単な例
@Composable
fun MyScreen() {
LaunchedEffect(Unit) {
println("処理A開始")
delay(2000) // 2秒待機
println("処理A終了")
}
println("処理B")
Text("Hello UI")
}
実行順序はこんなイメージ:
処理B
処理A開始
... (2秒待つ間もUIは動く)
処理A終了
となります。