2012-06-25 72 views
3

我想使用嵌套postDelayed,因为我需要做一些事情(延迟)5分钟后,停止它(延迟)30秒后,做其他事情,然后重复这两个事件从一开始的循环再次。 我似乎无法做到正确。嵌套postDelayed/Runnable/Handler Android

代码我有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 

的问题,这是好的运行第一次运行,但随后似乎堆叠在彼此的顶部...和所有延迟borked。我需要在5分30秒内执行Runnable秒,然后重复此过程。

回答

6

该代码运行几次后的最终结果是Handler发布的方式太多,每个Runnable的实例。如以上书面:

  1. 首先on_delayed职位1可运行
  2. 即可运行火灾然后接线柱2周的Runnable(一个在off_delayed,和另一个从运行返回之前())。
  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

+0

嗯,谢谢,这个作品!为什么哦为什么我没有想到这个?谢谢你的帮助! – slinden77