Android:Handlerで正確に周期的な実行

Handlerを使って 500ms間隔で 処理を実行する場合、以下のようにすると思います。ちなみにkotlinです。

    val handler = Handler()
    val runnable = object : Runnable {
        override fun run() {
            doHeavyWork() //重い処理
            handler.postDelayed(this, 500)
        }
    }

しかし、doHeavyWork()に処理時間が多くかかるばあい、その分の時間を差し引かなくてはいけません。例えば、 doHeavyWork() に300msかかるならpostDelayed(this, 200)にします。いや、そもそも doHeavyWork() にかかる時間は機種ごとに違うし、始めからわかってる事なんてほとんどないでしょう。

そこで、以下のようにします。

    val handler = Handler()
    val runnable = object : Runnable {
        override fun run() {
            val t = SystemClock.uptimeMillis()
            doHeavyWork() //重い処理
            handler.postAtTime(this, t + 500)
        }
    }

こんな感じにすると、いい感じになります。しかし、doHeavyWork()が500ms以上かかる場合はそもそも無理。video再生的なものならフレームをスキップするとか工夫が必要です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です