【Android】Kotlin でモダンな concurrency その2

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")

(つづく)

【Android】Kotlin でモダンな concurrency その1


関連ワード:  AndroidKotlin開発