嵌套的postDelayed / Runnable / Handler Android

我正在尝试使用嵌套的postDelayed,因为我需要在(延迟)5分钟之后做一些事情,在延迟30秒后停止它,做其他事情,然后从开始再次重复循环中的两个事件。 我似乎无法做对。

代码我有sofar:

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 ,然后重复该过程。

此代码运行几次后的最终结果是Handler发布了每个Runnable太多实例。 如上所述:

  1. 首先on_delayedpost1 Runnable
  2. 该runnable会触发,然后发布2个Runnables(一个在off_delayed中,另一个在从run()返回之前)。
  3. 这将继续增加,因为当这两个Runnables触发时,将创建4,依此类推。

您也没有利用Runnable可以多次发布到同一队列的事实,不必每次都创建新的。 如果要取消操作,这是必不可少的,因为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