2012-06-25 110 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