コルーチンと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フィードバックを取得できます。ローカル設定は不要です。