このコードがHello Worldを出力しないのはなぜですか?
runBlocking(Dispatchers.Main) {
launch {
delay(1)
println("Hello world")
}
}
しかし、これは印刷されます
runBlocking {
launch {
delay(1)
println("Hello world")
}
}
最初に見たものから、完全にアプリがフリーズします(ボタンクリックリスナー内で使用した場合)。
問題はあなたがデッドロックを引き起こしていることです:
Dispatchers.Main
コルーチンをメインアプリケーションルーパーにポスト(ディスパッチ)することで機能します。runBlocking
メインアプリケーションスレッドをブロックしますrunBlocking
が終了するのを待っているので、メインルーパーは投稿されたコルーチンを実行することは決してありませんDispatchers.Main.immediate
ベースディスパッチャーの少しスマートなバージョンである代わりに使用することで、「問題」をわずかに軽減できます。メインルーパーで既に実行されていてインプレースで実行されている場合、コルーティンはメインルーパーにポストされません。
これにより、launch
ブロックを実行できますが、delay
コルーチンを再度ポストして、メインルーパーを続行し、別のデッドロックを引き起こします。
2番目のコードサンプルは、そこで実行されているコルーチンが(runBlocking
それを除いて)メインスレッドと相互作用しないため、問題はありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加