コルーチンとは何ですか?
公式の説明:コルーチンは、ライブラリを複雑にすることで非同期プログラミングを簡素化します。プログラムのロジックはコルーチンで順次表現することができ、基礎となるライブラリはその非同期性を解決します。ライブラリは、ユーザーコードの関連部分をコールバックとしてパッケージ化し、関連イベントにサブスクライブし、異なるスレッド(または異なるマシン)での実行をスケジュールすることができ、コードは順次実行と同じくらい簡単です。
コルーチンは非常に軽量なスレッドのようなものです。スレッドはシステムによってスケジュールされ、スレッド切り替えまたはスレッドブロックのオーバーヘッドは比較的大きくなります。コルーチンはスレッドに依存しますが、コルーチンがハングしたときにスレッドをブロックする必要がないため、ほとんどコストがかかりません。コルーチンは開発者が制御します。したがって、コルーチンはユーザーモードスレッドのようなものでもあり、非常に軽量で、スレッド内にコルーチンをいくつでも作成できます。
コルーチンについて重要なことは、コルーチンがハングしたときに他のスレッドをブロックしないことです。コルーチンの基礎となるライブラリもブロッキングタスクを非同期で処理しますが、これらの複雑な操作は基礎となるライブラリによってカプセル化されます。コルーチンコードのプログラムフローはシーケンシャルであり、一連のコールバック関数は必要ありません。同期コードと同様に、理解も簡単です。デバッグと開発。これは制御可能であり、スレッドの実行と終了はオペレーティングシステムによってスケジュールされ、コルーチンは手動でその実行と終了を制御できます。
使用する
依存関係を追加
実装“ org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.1”
発売
これは、コルーチンを開始する最も一般的な方法です。最終的には、ジョブタイプオブジェクトを返します。このジョブタイプオブジェクトは、実際には多くの一般的に使用されるメソッドを含むインターフェイスです。簡単な使い方を見てみましょう:
LaunchJob.setOnClickListener {
log(START)
GlobalScope.launch {
delay(3000)
log(RUN)
}
log(END)
}
その結果、起動によってメインスレッドがブロックされないことが結果からわかる
D/MainActivity: START---> Time: 11:33:54.289, 线程:main
D/MainActivity: END---> Time: 11:33:54.324, 线程:main
D/MainActivity: RUNING---> Time: 11:33:57.334, 线程:DefaultDispatcher-worker-1
コルーチンのボディ同期
Suspend.setOnClickListener {
log(START)
GlobalScope.launch {
val sum1 = job1()
val sum2 =job2()
val sum = sum1+sum2
Log.d(
"MainActivity",
"Runing---> Time: ${
getNow()}, 线程:${
Thread.currentThread().name},Result: $sum"
)
}
log(END)
}
private suspend fun job1():Int{
delay(2000)
return 1+1
}
private suspend fun job2():Int{
delay(3000)
return 2+2
}
その結果、2つのメソッドが順番に実行され、合計5秒かかることが結果からわかります。
D/MainActivity: START---> Time: 11:37:39.675, 线程:main
D/MainActivity: END---> Time: 11:37:39.676, 线程:main
D/MainActivity: Runing---> Time: 11:37:44.691, 线程:DefaultDispatcher-worker-5,Result: 6
コルーチン本体-非同期
Async.setOnClickListener {
log(START)
GlobalScope.launch {
val sum1 = GlobalScope.async {
job1() }
val sum2 = GlobalScope.async {
job2() }
val sum = sum1.await()+sum2.await()
Log.d(
"MainActivity",
"Runing---> Time: ${
getNow()}, 线程:${
Thread.currentThread().name},Result: $sum"
)
}
log(END)
}
その結果、2つのメソッドが非同期で実行され、合計3秒かかることが結果からわかります。
D/MainActivity: START---> Time: 11:39:45.351, 线程:main
D/MainActivity: END---> Time: 11:39:45.360, 线程:main
D/MainActivity: Runing---> Time: 11:39:48.354, 线程:DefaultDispatcher-worker-6,Result: 6