Kotlinでのコルーチンの基本的な使用法

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のデフォルト値は、親コルーチンのコンテキストで実行することを意味します。その他の値は次のとおりです

  1. Dispatchers.Unconfined:プログラムが最初の一時停止ポイントまで実行されると、コルーチンスケジューラーが呼び出し元スレッドで開始されます。中断された後、中断された関数が実行されたスレッドで再開されます。再開されたスレッドは、中断された関数が実行されたスレッドに完全に依存します。無制限のスケジューラーは、コルーチンがCPU時間を消費せず、特定のスレッドに制限された共有データ(UIなど)を更新しない状況に適しています。

  2. Dispatchers.Default:デフォルトのスケジューラーを取得し、共有バックグラウンドスレッドプールを使用します

  3. newSingleThreadContext( "MyOwnThread"):新しいスレッドを取得します。両方とも実際のアプリケーションで解放する必要があります。不要になった場合は、close関数を使用するか、最上位の変数に格納します。応用。

  4. Dispatchers.IO:IOスレッドで実行

  5. Dispatchers.Main:メインスレッドで実行

  6. 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()関数を介して取得できます。

おすすめ

転載: blog.csdn.net/genmenu/article/details/87258789