kotlin/dispatcher
from kotlin/コルーチンのコンセプト
コルーチンはディスパッチャを使用して、実行に使用するスレッドを決定する。
Kotlin には次のような組み込みディスパッチャが用意されている
Dispatchers.Main
コルーチンはメインの Android スレッドで実行されます。
主に、UI の更新や操作を処理し、迅速に処理を行うために使用します。
Dispatchers.IO
メインスレッドの外部でディスクまたはネットワークの I/O を行う場合に適しています。
たとえば、ファイルの読み書き、ネットワーク オペレーションの実行など
Dispatchers.Default
launch()と async() を呼び出したとき、コンテキストでディスパッチャが指定されていない場合に使用されるデフォルト ディスパッチャ
メインスレッドの外部でコンピューティング負荷の高い処理を行う。
たとえば、ビットマップ画像ファイルの処理など
ユーザがアプリを起動すると、Androidシステムはアプリの新しいプロセスと1つのメインスレッド/Androidを作成する.
理解すべき二つの用語として、ブロックと非ブロックがある
Androidアプリの場合、実行にあまり時間がかからなければ、メインスレッド/Androidではブロックコードのみを呼び出す
メインセーフ
メインスレッドをブロックしないようにして、新しいイベントがトリガーされたらすぐに処理を実行できるようにすることが目標
長時間の処理はメインスレッド/Androidから移動し、ワーカースレッド/Androidを追加して処理する必要がある
長時間実行タスクがワーカースレッド/Androidをブロックしたとしても、その間メインスレッド/Androidはアクティブでいられる
ディスパッチャを切り替え、各タイミングで現在のスレッドを表示する例
code:kotlin
import kotlinx.coroutines.*
fun main() {
runBlocking {
println("${Thread.currentThread().name} - runBlocking function")
launch {
println("${Thread.currentThread().name} - launch function")
withContext(Dispatchers.Default) {
println("${Thread.currentThread().name} - withContext function")
delay(1000)
println("10 results found.")
}
println("${Thread.currentThread().name} - end of launch function")
}
println("Loading...")
}
}
code:出力
main @coroutine#1 - runBlocking function
Loading...
main @coroutine#2 - launch function
DefaultDispatcher-worker-1 @coroutine#2 - withContext function
10 results found.
main @coroutine#2 - end of launch function