我正在开发Android应用程序,我正在尝试管理一个Vibration事件。 检查开关时,我需要每隔几分钟安排一次。我一直在使用这段代码:
int delay3 = (60 + new Random().nextInt(60)) * 1000;
timer3.schedule(timerTask3, 0, delay3);
但是在取消选中并再次检查开关之前,计时器不会更改delay3
。有没有办法按随机时间安排事件,即delay3
每次运行任务时都应该更改而不取消选中开关?
谢谢。
答案 0 :(得分:1)
安排任务在一次随机延迟后运行。在任务内部,在所需的过程之后,在随机延迟之后重新安排它。
示例:
Random random = new Random();
Timer timer = new Timer();
timer.schedule(new MyTimerTask(timer, random), random.nextInt(10000));
使用:
private static class MyTimerTask extends TimerTask {
private final Timer timer;
private final Random random;
public MyTimerTask(Timer timer, Random random) {
this.timer = timer;
this.random = random;
}
@Override
public void run() {
System.out.println("TEST");
timer.schedule(new MyTimerTask(timer, random), random.nextInt(10000));
}
}
答案 1 :(得分:0)
您也可以使用postDelayed
类的android.os.Handler
方法来代替
scheduleAtFixedRate
类的java.util.Timer
方法。
只需创建android.os.Handler
类的实例并调用postDelayed
实例的android.os.Handler
方法,而不是创建java.util.Timer
类的实例并调用{{1} } scheduleAtFixedRate
实例的方法。
请注意,您必须将java.util.Timer
界面替换为TimerTask
界面。
在Runnable
实例的run
方法结束时(作为第一个参数传递到Runnable
实例的postDelayed
方法),以新的随机延迟再次调用与{strong>相同 android.os.Handler
实例相同的postDelayed
实例的android.os.Handler
方法!
无需创建新的Runnable
实例,也无需创建新的TimerTask
实例!
这效率更高,因为在堆内存中分配的对象较少,因此垃圾收集器不那么忙于以这种方式从堆内存中分配对象!
我使用自己的想法编写了一个演示:
Runnable
请注意,以上代码使用了Java 8 lambda表达式。
在Java 7及以下版本中,您可以创建实现import android.os.Handler;
import java.util.Random;
public class Demo
{
private boolean postAgain;
public void start()
{
postAgain = true;
final Handler handler = new Handler();
final Random random = new Random();
final Runnable runnable = () ->
{
log.d("Hello");
if (postAgain)
{
handler.postDelayed(runnable,random.nextInt(10000));
}
};
handler.postDelayed(runnable,random.nextInt(10000));
}
public void stop() { postAgain = false; }
方法的Runnable
接口的实例,而无需定义实现的新命名类
run
界面。
还请注意,Runnable
方法的所有局部语言都必须全部为start
,以便能够在lambda表达式或{{ 1}}实例。
调用final
方法以随机延迟重复打印“ Hello”,然后调用run
方法将其停止。
请注意,Runnable
方法仅将start
字段从true设置为false才能停止循环。