🚀 ニフティ’s Notion

【モバイルアプリ2024 #11】Kotlin Coroutines

💡
この章で話すこと
  • Kotlin Coroutines

Kotlin Coroutines

コルーチンとは、中断可能な関数のことです。

コルーチンでは通常の関数に2つの振る舞いを追加します。

  • suspend:現在のコルーチンの実行を一時停止し、すべてのローカル変数を保存
  • resume:中断されたコルーチンを一時停止した場所から再開

Kotinではコルーチンを言語仕様として定義され実装されています。しかし、Kotlinで定義されているのは最小限のAPIであるため、実際はJetBrainが作っている kotlinx.coroutines ライブラリを使用するケースが多いです。これによりasync, awaitなどの記法が使えるようになります。

image block

HTTP通信のような時間のかかるタスクを実行するとき、Mainスレッドで実行してしまうと画面描画やタップなどの処理を止めてしまうことになるので、別スレッドで実行したいです。

しかし、別スレッドで通信処理をしてもI/Oスレッドではリクエストを投げた後レスポンスを受け取るまで何もせずに待っている時間があります。

そこで、リクエストを投げた時点で呼び出し元に処理を戻します。レスポンスが得られたイベントで再度処理をI/Oスレッドに戻し、結果を返すようにする事で待ち時間を無くします。

これをコルーチンで実現します。

Android, KotinではDispatchersという実行スレッドのようなものが定義されています。これらを適切に使い分けることで高パフォーマンスで安全な動作を実現できます。

Dispatchers.Main  - このディスパッチャを使用すると、コルーチンはメインの Android スレッドで実行されます。UI を操作して処理を手早く作業する場合にのみ使用します。たとえば、 suspend  関数の呼び出し、Android UI フレームワーク オペレーションの実行、 LiveData  オブジェクトのアップデートを行う場合などです。
Dispatchers.IO  - このディスパッチャは、メインスレッドの外部でディスクまたはネットワークの I/O を実行する場合に適しています。たとえば、 Room コンポーネント の使用、ファイルの読み書き、ネットワーク オペレーションの実行などです。
Dispatchers.Default  - このディスパッチャは、メインスレッドの外部で CPU 負荷の高い作業を実行する場合に適しています。ユースケースの例としては、リストの並べ替えや JSON の解析などがあります。