空手で出勤

6月6日木曜日、晴れ

ひょっとして大丈夫じゃないか? そうおもったら試さずにいられなくなって今日はカバンなしで出勤。ポケットに家の鍵と社員証。手に Suica つきの iPhone。
結論から言うと、ほぼ困ることなく一日過ごせた。財布に入れていたポイントカード兼ヨドバシゴールドカードとメモを取るための鉛筆が無かったことくらいが感じた不便のすべて。買い物はコンビニ、 Suica で決済可能なので。
なにかあったときの健康保険証と、いざというときのキャッシュカードを忘れなければ、仕事をするに困らないというわけだ。さすが都会。

それにしても混雑する電車も、場所を取らないよう気をつかうカバンなし、両手が空いているというだけで、これほど精神的に楽だとは思いもよらなかった。文字通り身が軽い。

* * *

仕事では Activity に Dispatcher.Main と Job からなる CoroutineContext を置く理由を、なんとなく理解できた気がする。(ひょっとしたら公式ドキュメントのどこかにあるのかも、だけれど)

Dispatcher.Main は UI スレッド。 UI スレッド上で launch するコルーチンは View オブジェクトを触ることを目的としているはずで、だから onDestroy のあとで View を触る可能性を排除したい。
そのために(空の) Job オブジェクトを定義し Activity で launch するジョブたちの親にする。 onDestroy で親 Job を cancel すれば、この Activity の CoroutineContext を起点に開始したすべてのジョブは止まる。

なるほどねえ……

余談だけれど。 onDestroy は UI スレッド上で呼ばれるから Dispatcher.Main をディスパッチャーにした Activity の親 Job は onDestory の好きな場所で cancel すればよい。(うまくできている)

記憶の限りでだけれど公式の説明が次のようになっていて、ジョブの初期と停止の位置が親メソッド呼び出しの入れこと対称性がないことが、ちょっと気になっていたんです。

private var lateinit job: Job

override fun onCreate(savedInstanceState: Bundle) {
  super.onCreate(savedInstanceState)
  job = Job()
}

override fun onDestroy() {
  super.onDestroy()
  job.cancel()
}

この記事が気に入ったらサポートをしてみませんか?