Handler.postDelayed running for extra time

2020-08-05 10:30发布

I am writing an handler to run for an fix amount(30 Sec) time. Basic on that it update counter to draw a view component.

counterRunnable = new Runnable() {
            int currV = 0;

            public void run(){

                if(count >= 360) {
                    counterHandler.removeCallbacks(this);
                    onTimerComplete();
                } else {
                    count++;
                    counterHandler.postDelayed(this, 83); // (30/360) = ~83
                }
            }
        };

As I am running back it for delay of 83ms for 360 time (83*360 = 29880ms ~30 Sec) but it is running for ~39 sec. Any suggestion if I am doing anything wrong.

Analysis: I checked same with Timer(scheduled at fix rate) and it's performing better as compare Handler.postDelay but still any suggestion why postDelay worst here ?

1条回答
唯我独甜
2楼-- · 2020-08-05 11:13

You can check this answer and implement this behaviour with AlarmManager.

As you can see in the documentation, there can be an additional delay for the runnable to start running. Also you can check this explanation from @CommonsWare:

Android is not a real-time operating system. All postDelayed() guarantees is that it will be at least the number of milliseconds specified. Beyond that will be dependent primarily on what the main application thread is doing (if you are tying it up, it cannot process the Runnable), and secondarily on what else is going on the device (services run with background priority and therefore get less CPU time than does the foreground).

Edit: Keep in mind that Timer creates a new thread for your code to be executed. So it doesn't depend on main thread's workload. You can check a discussion about this here

查看更多
登录 后发表回答