0Pricing
Android Academy · レッスン

コルーチンとSuspend関数

同期コードのように読みやすい非同期コードを記述します。suspend関数、コルーチンスコープ、ディスパッチャ(IO、Main、Default)を使います。

「コルーチンとSuspend関数」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン3/6です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全6レッスンが含まれています。

問題:UIスレッドのブロック

AndroidはすべてのUI処理をメインスレッドで実行します。メインスレッドでネットワークリクエストやデータベースの読み取りを行うと、完了するまでUIがフリーズします。

UIが5秒以上フリーズすると、AndroidはANR(App Not Responding)ダイアログを表示し、ユーザーはアプリを強制終了できるようになります。

Coroutinesとは

Kotlin Coroutinesは、非同期コードを逐次実行のように記述する方法です。コールバックやRxJavaのチェーンは必要ありません。

  • 軽量 — 数千のコルーチンを同時に実行できます
  • 中断可能 — コルーチンはスレッドをブロックせずに一時停止・再開できます
  • 構造化されている — ライフサイクル(スコープ)に従います

suspend関数

suspendが付いた関数は、スレッドをブロックせずに実行を一時停止できます。別のsuspend関数またはコルーチンスコープからのみ呼び出せます。

import kotlinx.coroutines.*

suspend fun fetchData(): String {
    delay(1000)  // simulates 1 second network call
    return "Data loaded!"
}

fun main() = runBlocking {
    println("Fetching...")
    val result = fetchData()  // suspends here, doesn't block
    println(result)           // Data loaded!
    println("Done")
}

コルーチンスコープ

すべてのコルーチンは、ライフサイクルを定義するスコープ内で実行されます。

  • viewModelScope — ViewModelがクリアされるとキャンセルされます
  • lifecycleScope — Activity/Fragmentが破棄されるとキャンセルされます
  • GlobalScope — 永続的に存続します(使用は避けてください)
  • runBlocking — テスト専用です

launchとasync

コルーチンを開始する方法は2つあります。

  • launch { } — 起動して待機せずに進み、戻り値はありません
  • async { }.await() — 待機して受け取れる結果を返します
import kotlinx.coroutines.*

fun main() = runBlocking {
    // launch: no return value
    launch {
        delay(500)
        println("launch done")
    }

    // async: returns a Deferred<T>
    val deferred = async {
        delay(300)
        42
    }
    val result = deferred.await()
    println("async result: $result")
}

Dispatcher:どのスレッドで実行するか

Dispatcherは、コルーチンを実行するスレッドを制御します。

  • Dispatchers.Main — UIスレッド(ビューの更新に使用)
  • Dispatchers.IO — ネットワークやディスク操作に使用
  • Dispatchers.Default — CPU負荷の高い処理に使用

コルーチン内でDispatcherを切り替えるには、withContext(Dispatchers.IO) { }を使用します。

viewModelScopeの例

UIをブロックせずにViewModelでデータを取得します。

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.*

class DataViewModel : ViewModel() {

    fun loadData() {
        viewModelScope.launch {
            // Switch to IO thread for network
            val data = withContext(Dispatchers.IO) {
                // simulate network request
                delay(1000)
                "Result from server"
            }
            // Back on Main thread — safe to update UI
            _uiState.value = data
        }
    }
}

コルーチンでのエラー処理

通常のコードと同じように、try/catchを使ってコルーチン内の例外を処理します。

viewModelScope.launch {
    try {
        val result = withContext(Dispatchers.IO) {
            api.fetchUser()  // may throw IOException
        }
        _user.value = result
    } catch (e: Exception) {
        _error.value = "Failed: ${e.message}"
    }
}

コルーチンの並列実行

async/awaitを使って2つのタスクを並列実行し、両方の完了を待機します。

viewModelScope.launch {
    // Both run at the same time!
    val userDeferred = async(Dispatchers.IO) { api.getUser() }
    val postsDeferred = async(Dispatchers.IO) { api.getPosts() }

    val user = userDeferred.await()
    val posts = postsDeferred.await()

    _state.value = UiState(user, posts)
}

理解度チェック

ネットワーク操作やデータベース操作には、どのコルーチンDispatcherを使用すべきですか?

まとめ:コルーチン

コールバックを使わずに非同期コードを書けるようになりました。

  • suspend fun — スレッドをブロックせずに一時停止できます
  • viewModelScope.launch { } — ViewModelでコルーチンを開始します
  • withContext(Dispatchers.IO) — バックグラウンドスレッドに切り替えます
  • async { }.await() — 結果を受け取る並列処理を行います
  • コルーチン内でもtry/catchは通常どおり機能します

次はRepositoryパターンです。データソースを明確に分離する方法を学びます。

よくある質問

「コルーチンとSuspend関数」レッスンは無料ですか?

はい。「コルーチンとSuspend関数」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全6レッスンが含まれています。

「コルーチンとSuspend関数」で何を学びますか?

同期コードのように読みやすい非同期コードを記述します。suspend関数、コルーチンスコープ、ディスパッチャ(IO、Main、Default)を使います。 ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Android Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/6です。

「コルーチンとSuspend関数」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAndroid Academyレッスンでコードを書いて実行できますか?

はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ViewModelとLiveData
  2. Room Database
  3. コルーチンとSuspend関数
  4. Repositoryパターン
  5. Navigation Component
  6. Hiltによる依存性注入
← Android Academyに戻る