我试图用一个嵌套postDelayed,因为我需要做的后,一些(延迟)5分钟,(延迟)30秒后停止,去做别的事情,然后在循环再次从一开始就重复这两个事件。 我似乎无法得到它的权利。
I am trying to use a nested postDelayed because I need to do something after (delayed for) 5 minutes, stop it after (delayed) 30 seconds, do something else, then repeat both events in the cycle again from the start. I just can't seem to get it right.
code我有SOFAR:
code I have 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
S在精确至5分30秒,然后重复上述过程。
The problem with this is runs fine the first run, but then seems to stack on top of each other...and all delays are borked. I need to execute the both Runnable
s in exactly 5 minutes and 30 seconds, then repeat the process.
在此之后code的最终结果已经跑了几次的是,处理程序
帖子的方式每个太多的情况下,的Runnable
。正如上面写的:
The net result after this code has run a few times is that the Handler
posts way too many instances of each Runnable
. As written above:
您还没有利用这样一个事实:的Runnable
可以发布到同一个队列多次的优势,它没有新的每次创建。如果要取消操作,这是必要的,因为在处理程序remove方法
查找所有匹配的情况下,从队列中删除。您可以尝试这样的事情,而不是:
You are also not taking advantage of the fact that a Runnable
can be posted to the same queue multiple times, it doesn't have to be created new each time. This is essential if you want to cancel the actions, because the remove method on Handler
look for all the matching instances to remove from the queue. You might try something like this instead:
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
项的所有实例取消计时器操作的方法。
I also added one more method you can use to cancel the timer operation by removing all the instances of your Runnable
items from the queue.
心连心
上一篇:是否有可能加载/在Android中使用PhoneGap的SD卡创建的数据库?有可能、加载、数据库、Android
下一篇:Proguard的乱七八糟的Javascript接口功能于Android清单高于17定位SDK时,高于、清单、接口、功能