I am trying to use a nested postDelayed because I need to do something after (delayed for) 5 minutes, stop it after (delayed) 30 seconds, do something else, then repeat both
The net result after this code has run a few times is that the Handler
posts way too many instances of each Runnable
. As written above:
You are also not taking advantage of the fact that a Runnable
can be posted to the same queue multiple times, it doesn't have to be created new each time. This is essential if you want to cancel the actions, because the remove method on Handler
look for all the matching instances to remove from the queue. You might try something like this instead:
private long EnabledAfter = 300000; // 5 minutes
private long DisabledAfter = 30000; // 30 seconds
private Runnable Enabler = new Runnable() {
public void run() {
something.enable(context);
something.enable_else(context, true);
Handler.postDelayed(Disabler, DisabledAfter);
}
};
private Runnable Disabler = new Runnable() {
public void run() {
something.disable(context);
something.disable_else(context, false);
Handler.postDelayed(Enabler, EnabledAfter);
}
};
public void start_timers(){
Handler.postDelayed(Enabler, EnabledAfter);
}//end method
public void stop_timers(){
Handler.removeCallbacks(Enabler);
Handler.removeCallbacks(Disabler);
}//end method
I also added one more method you can use to cancel the timer operation by removing all the instances of your Runnable
items from the queue.
HTH