個人見解です。
同期タイプと非同期タイプがある。
runBlocking {} は同期タイプ。
UI(メイン)スレッドを止めてワーカースレッドの処理を待つ。
処理後にUIスレッドに戻り処理を続ける。
launch {} は非同期タイプ。
UIスレッドは動き続ける。ワーカースレッドは処理後に指定の場所に保存して通知を送る。
UIスレッドは通知が来たらデータを取り出し処理をする。
ワーカースレッドは、シングル、マルチが指定できる。
低性能CPUは少ないスレッド数でないとUIスレッドに悪影響がでる。
private val parentJob = Job()
fun test() {
/*
* 呼ばれた分が同時に処理を始める。
* 性能の低い機種はUI処理に滞りが出るので注意。
*/
CoroutineScope.launch( parentJob ) {
asyncTask()
}
/*
* プールに積んで非同期でシングル処理を行う。
*/
CoroutineScope(
Executors.newSingleThreadExecutor().asCoroutineDispatcher()
).launch( parentJob ) {
asyncTask()
}
/*
* プールに積んで非同期で指定数の処理を並行する。ここでは4スレッド指定。
*/
CoroutineScope(
Executors.newFixedThreadPool(4).asCoroutineDispatcher()
).launch(parentJob) {
asyncTask()
}
}
suspend fun asyncTask() {
/* 省略 * /
}
override fun onDestroy() {
parentJob.cancel // 実行中、待機中の非同期処理を止める。
super.onDestroy()
}
kotlinの非同期処理はシンプルで応用も簡単。
宣言が、Javaより厳格だけど慣れれば分かりやすい。
市販のガイドがJavaだった。それが不幸の始まりだったかも(笑)