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 のコンテキストと結合する。