嵌套postDelayed /可运行/处理器的Android(nested postDelayed

2019-06-25 18:02发布

我试图用一个嵌套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

与这就是问题所在运行正常第一次运行,但随后似乎堆叠在彼此的顶部...和所有延迟borked。 我需要执行两个Runnable在整整5分30秒S,然后重复上述过程。

Answer 1:

此代码后已经跑了几次最终的结果是, Handler每个职位太多的情况下, Runnable 。 正如上面写着:

  1. 首先on_delayed职位1的Runnable
  2. 该Runnable火灾再上岗2周的Runnable(一个在off_delayed,另一个是运行在返回前())。
  3. 这将继续,因为乘这两个的Runnable火灾,4将获得创建时,一个等等。

您还没有利用的事实优势Runnable可以发布到同一个队列多次,它没有新的每次创建。 如果你想取消行动这一点至关重要,因为remove方法Handler寻找所有匹配实例从队列中删除。 你可以尝试这样的事情,而不是:

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



文章来源: nested postDelayed / Runnable / Handler Android