如何安排随机时间(每个随机分钟)事件

时间:2017-06-07 16:18:18

标签: java android random timer timertask

我正在开发Android应用程序,我正在尝试管理一个Vibration事件。 检查开关时,我需要每隔几分钟安排一次。我一直在使用这段代码:

int delay3 = (60 + new Random().nextInt(60)) * 1000;

timer3.schedule(timerTask3, 0, delay3);

但是在取消选中并再次检查开关之前,计时器不会更改delay3。有没有办法按随机时间安排事件,即delay3每次运行任务时都应该更改而不取消选中开关?

谢谢。

2 个答案:

答案 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才能停止循环。