本日は、Handler の timer 絡みのコードを深堀りしました。
Handler.postAtTime は、Handler.sendMessageAtTime をコールしています。
そして、Handler.sendMessageAtTime は、MessageQueue.enqueueMessage をコールしています。
ここでのトリックは、MessageQueue が、現在取得できる機器の稼働時間 SystemClock.uptimeMillis() と、引数で指定された稼働時間を比較して、指定された稼働時間を過ぎていた場合には、Handler を取り出して実行するというものです。稼働時間が過ぎていない場合には、MessageQueue が queue に溜まっている次の Handler を処理します。
postDelayed の場合は、現在取得できる機器の稼働時間に指定された millisec を足して、sendMessageAtTime しています。
なるほど、これはスマートなやり方だ。ちなみに、だからといって一度に大量の Handler を postDelayed で投入するのは、賢いやり方とは言えない。
機器の稼働時間がオーバーフローする事は無いのかな・・・
0 件のコメント:
コメントを投稿