gpt4 book ai didi

java - 嵌套的 postDelayed/Runnable/Handler Android

转载 作者:太空宇宙 更新时间:2023-11-03 12:22:38 24 4
gpt4 key购买 nike

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

我目前的代码:

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_delayed posts 1 Runnable
  2. 那个 runnable 触发然后发布 2 个 Runnable(一个在 off_delayed 中,另一个在从 run() 返回之前)。
  3. 这将继续增加,因为当这两个 Runnable 触发时,将创建 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

关于java - 嵌套的 postDelayed/Runnable/Handler Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11197543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com