旨辛チキンおいしい

よくある備忘録みたいな奴です。

CoroutineContext のメモ

まだまとまってないけど雑なメモ


CoroutineContext とは、その名の通り、コルーチンの実行される文脈や条件(コンテキスト)を決定するもの。

実態は連想配列のようなもので、とあるキーとそれに対応する値のペアが複数格納されている。

キーとなれるのは CoroutineContext.Key インタフェースを実装したオブジェクトで、値となれるのは CoroutineContext.Element インタフェースを実装したオブジェクト。

Key インタフェースは型パラメータとして Element 型を取り、 Element 型のキーになれることを表す。 ちなみに Element は CoroutineContext インタフェースを継承している。

CoroutineContext は + (plus) メソッドで結合することができ、結合すると CombineContext クラスになる。 CombineContext クラスは CoroutineContext インタフェースを実装しているので、複数結合することが可能。 (CombineContext(CombineContext(CombineContext(context, element1), element2), element3) のような感じ。)

CombineContext から Key に対応する Element を取り出す場合、 + 演算子の左項に指定した CoroutineContext から優先的に取得される(たぶん)。

よく使用される Element はコルーチンを実行するスレッドを決定する ContinuationInterceptor やコルーチンのライフサイクルやキャンセルを司る Job がある。

どんな Element も持たない空っぽな CoroutineContext の実装として、 EmptyCoroutineContext クラスが用意されている。

新しくコルーチンを起動する launch メソッドはその引数に context: CoroutineContext を取ることができるが、何も指定しない場合のデフォルト値にこの EmptyCoroutineContext が指定されている。

launch メソッドは引数で指定された context を、自身の所属する CoroutineScope のコンテキストと結合する。