Dispatch
Dispatch は coroutine のキーとなる概念で、スレッド間を移動するアクションとなります。
現在の Java でいう runOnUiThread と等価です。
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}
Kotlin Android でのUIコンテキストは、Handlerをベースとして dispatcher が実装されています、
以下のように使います。
launch(UI) { ... }
launch(UI, CoroutineStart.UNDISPATCHED) { ... }
launch(UI) では、Handler 内の Runnable に postされますので直接実行されません。
それに対して、launch(UI, CoroutineStart.UNDISPATCHED) は、そのスレッドですぐにラムダ部分を実行します。
UI は、メインスレッドが resume されたとき、coroutine がそれに対して dispatch されるのを保証しており、 メインルーパーに post するというネイティブAndroidの Handler が使われています。
val UI = HandlerContext(Handler(Looper.getMainLooper()), "UI")