誰もがそれらの違いを説明できますか?スコープはそれらをキャンセルするための参照(例:Job)を提供し、コンテキストは基になるスレッドへの参照を提供すると思います。そうですか?
スコープ
すべてのコルーチンビルダー(launch、asyncなど)とすべてのスコープ関数(coroutineScope、withContextなど)は、実行するコードの内部ブロックに独自のJobインスタンスを持つ独自のスコープを提供します。慣例により、それらはすべて、ブロック内のすべてのコルーチンが完了するのを待ってから、自分自身を完了するため、構造化された同時実行の規則が適用されます。
コンテキスト
コルーチンは常に、Kotlin標準ライブラリで定義されているCoroutineContextタイプの値で表されるコンテキストで実行されます。
コルーチンコンテキストは、さまざまな要素のセットです。主な要素は、前に見たコルーチンのジョブと、このセクションで説明するそのディスパッチャーです。
はい、原則としてあなたは正しいです、ここに詳細を示します。
スコープ
viewModelScope
)にバインドしてリークを回避する方法ですコンテキスト
コンテキストは、コルーチンを実行するスレッドを決定します。 4つのオプションがあります。
Dispatchers.Default
-CPUを集中的に使用する場合(大きなリストの並べ替えなど)Dispatchers.Main
-これが何になるかは、プログラムの実行時の依存関係に追加した内容によって異なります(例 kotlinx-coroutines-Android
、AndroidのUIスレッド用)Dispatchers.Unconfined
-特定のスレッドで制限なしにコルーチンを実行しますDispatchers.IO
-重いIOの作業(長時間実行のデータベースクエリなど)の場合)次の例では、スコープとコンテキストの両方をまとめています。 IO work)に指定されたスレッドでコルーチンが実行される(変更されていない場合)新しいスコープを作成し、それらのスコープを介してそれらをキャンセルします。
val scope = CoroutineScope(context = Dispatchers.IO)
val job = scope.launch {
val result = suspendFunc1()
suspendFunc2(result)
}
// ...
scope.cancel() // suspendFunc1() and suspendFunc2() will be cancelled