Kotlin Coroutines

Kotlin Coroutinesは、Kotlinにおける非同期処理並行処理をシンプルかつ効率的に記述するための仕組みです。従来のコールバックやスレッドベースのアプローチに比べ、保守性が高く、読みやすいコードを書くことができます。特にAndroid開発において、メインスレッド(UIスレッド)をブロックせずにネットワークアクセスやデータベース操作などを行うために非常に重要です。


1. 基本概念

コルーチンとは

コルーチンは、軽量スレッドのようなものです。一時停止 (suspend) や再開が可能で、従来のスレッドよりも少ないリソースで非同期処理を実行できます。

主な特徴

  • 軽量:数千のコルーチンを同時に起動しても問題ありません。

  • 一時停止と再開:処理を一時停止 (suspend) し、後で再開できます。

  • 構造化された並行処理:親子関係でコルーチンを管理することでキャンセルなどが安全に行えます。


2. 重要なキーワードと関数

suspend関数

Suspending function(中断可能関数)は、他の中断可能な処理を呼び出せる関数です。

kotlin
suspend fun fetchData(): String { delay(1000) // 1秒待機(非ブロッキング) return "データ取得完了" }

launchasync

  • launch:戻り値がなく、ジョブ(Job) を返す。

  • async:非同期に処理し、結果(Deferred<T>) を返す。

kotlin
// launch例(戻り値なし) GlobalScope.launch { println("非同期処理開始") } // async例(結果を受け取る) val deferred = GlobalScope.async { "結果" } val result = deferred.await()

3. スコープとディスパッチャ

コルーチンスコープ (CoroutineScope)

コルーチンのライフサイクルを管理します。Androidでは lifecycleScopeviewModelScope をよく使います。

ディスパッチャ (Dispatcher)

どのスレッドで実行するかを決定します。

Dispatcher 特徴
Dispatchers.Main UIスレッドで実行
Dispatchers.IO 入出力向けのバックグラウンドスレッド
Dispatchers.Default CPU集約型の処理に適する

例:

kotlin
lifecycleScope.launch(Dispatchers.IO) { val data = fetchData() withContext(Dispatchers.Main) { textView.text = data } }

4. エラーハンドリングとキャンセル

  • try-catchsuspend 関数内の例外処理が可能です。

  • コルーチンは cancel() でキャンセルできます。

  • CoroutineExceptionHandler を使えば、非同期例外のグローバルな処理も可能です。


5. Androidでの実用例

ViewModel内の使用(Jetpack ViewModel + viewModelScope)

kotlin
class MyViewModel : ViewModel() { fun loadData() { viewModelScope.launch { val result = repository.getData() _data.value = result } } }

Activityでの使用(lifecycleScope)

kotlin
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) lifecycleScope.launch { val data = fetchData() updateUI(data) } } }

まとめ

Kotlin Coroutinesは、Android開発における非同期処理の標準的な方法となっており、可読性・安全性・効率性の面で非常に優れています。コールバックのネストや複雑なスレッド管理を避けながら、UIスレッドをブロックしない処理を実現できます。

生成日:2025/05/04