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 ?
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:
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