1.コルーチンの作成方法
1. launch()を使用します
- 例は次のとおりです。
GlobalScope.launch {
delay(3000)
}
- launch()関数のソースコードは次のとおりです。
public fun CoroutineScope.launch(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job {
val newContext = newCoroutineContext(context)
val coroutine = if (start.isLazy)
LazyStandaloneCoroutine(newContext, block) else
StandaloneCoroutine(newContext, active = true)
coroutine.start(start, coroutine, block)
return coroutine
}
環境 :
オプションのCoroutineContextパラメーターを受け取ります。これは、主にJob要素とCoroutineDispatcher要素を含むいくつかの要素のコレクションです。コルーチンシーンを表すことができます。EmptyCoroutineContextのデフォルト値は、親コルーチンのコンテキストで実行することを意味します。その他の値は次のとおりです
-
Dispatchers.Unconfined:プログラムが最初の一時停止ポイントまで実行されると、コルーチンスケジューラーが呼び出し元スレッドで開始されます。中断された後、中断された関数が実行されたスレッドで再開されます。再開されたスレッドは、中断された関数が実行されたスレッドに完全に依存します。無制限のスケジューラーは、コルーチンがCPU時間を消費せず、特定のスレッドに制限された共有データ(UIなど)を更新しない状況に適しています。
-
Dispatchers.Default:デフォルトのスケジューラーを取得し、共有バックグラウンドスレッドプールを使用します
-
newSingleThreadContext( "MyOwnThread"):新しいスレッドを取得します。両方とも実際のアプリケーションで解放する必要があります。不要になった場合は、close関数を使用するか、最上位の変数に格納します。応用。
-
Dispatchers.IO:IOスレッドで実行
-
Dispatchers.Main:メインスレッドで実行
-
newFixedThreadPoolContext(2、 "ss"):新しいスレッドプールで実行するか、不要になったときにclose関数を使用するか、最上位の変数に格納してアプリケーション全体で再利用します。
- コルーチンの仕事はその文脈の一部です。コルーチンは、coroutineContext [Job]式を使用して、それが属するコンテキストでコルーチンを取得できます。コルーチン
println("My job is ${coroutineContext[Job]}")
の状態を判別します。
開始:
コルーチンスタートアップの設定は、通常、デフォルト値を使用し、他の値の使用にはまだ遭遇していません
ブロック:
コルーチンで実行する必要のあるコード
戻り値はJobオブジェクトです
2. async()を使用します
- 例は次のとおりです。
GlobalScope.async {
delay(3000)
}
- aysnc()関数はlaunch()関数と同じですが、唯一の違いは、async {}がDeferred型を返すため、戻り値があることです。async {}の戻り値を取得するには、await()関数が必要です。これはサスペンド関数でもあります。呼び出されると、asyncのコードが実行されて特定の値が返されるまで、現在のコルーチンがサスペンドされます。
3. withContext {}を使用します
- 例は次のとおりです。
GlobalScope.async (Dispatchers.Main) {
withContext(coroutineContext){
delay4s()
}
}
- withContext {}は新しいコルーチンを作成せず、指定されたコルーチンで一時停止されたコードブロックを実行し、コードブロックが完了するまでコルーチンを一時停止します。
4. runBlocking {}を使用します
- 例は次のとおりです。
fun main() = runBlocking {
delay(1000)
}
- runBlocking {}は、コルーチンが終了するまで現在のスレッドをブロックしながら、新しいコルーチンを作成することです。これはコルーチンでは使用しないでください。主に主な機能とテスト用に設計されています。
- Androidでは、GlobalScope.async()関数とGlobalScope.launch()関数は通常、コルーチンを開始するために使用されます。これらはasync()関数とlaunch()関数に対応しますが、コルーチンのライフサイクルはコルーチンの影響を受けるだけです。アプリケーション全体のライフサイクル。制限。次に、これら2つの関数の中で、上記の関数を使用してサブコルーチンを作成できます。また、GlobalScope.launch {}とGlobalScope.async {}によって作成された新しいコルーチンには、親コルーチンがありません。
2.ジョブと延期
- ジョブ、タスクは、コルーチンで実行する必要のあるコードロジックをカプセル化します。ジョブはキャンセルでき、ライフサイクルは単純です。3つの状態があります。
- ジョブが完了すると、戻り値はありません。戻り値が必要な場合は、JobのサブクラスであるDeferredを使用する必要があります。戻り値はawait()関数を介して取得できます。