Kotlin coroutine入門①の続きです。
前回は、coroutineとは?から仕組み、launch、async、awaitの動きをみました。
今回は、coroutineをandoridで扱う上で知っておきたい coroutine scope & jobについて書いていきます。
CoroutineScope &CoroutineContextとDispatchersを理解する
CoroutineContext
CoroutineContextは、要素のセットです。 coroutineの文脈や環境の状態を表す値の集まりで、キーと値のペアとして情報を保持しています。主な要素としてはcoroutineのjobとDispatchersです。
端的に言うと Coroutineを利用するための情報が全て入っている。ここでCoroutineが実行される
Dispatchers
Dispatcher はコルーチンをどのスレッドで実行するかといったことを決定します。
以下のような種類があります。
Dispatchers.Main
UIに関する処理をするメインスレッドの指定です。
Dispatchers.Main.immediate
UI更新を即時行いたい際に使用されます。
Dispatchers.Default
共有スレッドプールを使用し、CPUのコア数に従って設定される。
CPUに負荷をかけるような計算をするような処理に対して使うことが推奨されます。
Dispatchers.IO
その処理に必要なコルーチンの数に応じて必要な分だけ共有スレッドプールを使用する。
DBの検索等、I/Oに負荷をかけるような処理に対して使うことが推奨されます。
Dispatchers.Unconfined
一度中断させて再開した場合は別スレッドに切り替わっている可能性があります。
job
任意のスレッドで行う仕事。launchなどCoroutineBuilderにて作成されたコルーチンはJobとして扱われる。
CoroutineScope
CoroutineScope とは、コルーチンが所属する仮想的な領域です。
コルーチンはいずれかのスコープに属します。
launch や async といったコルーチンビルダーは CoroutineScope の拡張関数として定義されているため、 CoroutineScope なしではコルーチンは起動できません。
前の記事でsuspend関数がCoroutineもしくはsuspend関数からしか呼び出せないのは、このためです。
以上の関係の全体を把握するにはここの関係図が分かりやすいです
まとめ
前回launchやasyncで試したコードはCoroutineScope やContext Dispatchersによって動いていることが分かりました。
次はKotlin coroutine入門 ③~ViewModelの中でcoroutineを扱ってみる~