我正在尝试使用嵌套的postDelayed,因为我需要在(延迟)5分钟之后执行某些操作,在延迟(延迟)30秒后执行某些操作,执行其他操作,然后从开始再次在循环中重复这两个事件。 我似乎无法做对。
代码我有问题:
private long EnabledAfter = 300000; // 5 minutes
private long DisabledAfter = 30000; // 30 seconds
public void start_timers(){
on_delayed(EnabledAfter);
}//end method
private void on_delayed(long period_off){
Delayed = new Runnable() {
public void run() {
something.enable(context);
something.enable_else(context, true);
off_delayed(DisabledAfter); // and disable both again delayed
Handler.postDelayed(Delayed, EnabledAfter);
}
};
Handler.postDelayed(Delayed, EnabledAfter);
}//end method
private void off_delayed(long period_on){
Delayed = new Runnable() {
public void run() {
something.disable(context);
something.disable_else(context, false);
on_delayed(period_on); // start the proces again from the start...
//Handler.postDelayed(Delayed, DisabledAfter);
}
};
Handler.postDelayed(Delayed, period_on);
}//end method
这个问题在第一次运行时运行良好,但后来似乎堆叠在一起......并且所有延迟都被堵塞了。我需要在5分30秒内执行两个Runnable
,然后重复这个过程。
答案 0 :(得分:7)
此代码运行几次后的最终结果是Handler
发布每个Runnable
的实例太多。如上所述:
您也没有利用Runnable
可以多次发布到同一队列的事实,不必每次都创建新的。{1}}。如果要取消操作,这是必不可少的,因为Handler
上的remove方法会查找要从队列中删除的所有匹配实例。您可以尝试这样的事情:
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
我还添加了一个方法,您可以通过从队列中删除Runnable
项的所有实例来取消计时器操作。
HTH