gpt4 book ai didi

java - 带有重置选项的 Android java.util.Timer

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:30:54 28 4
gpt4 key购买 nike

我有一个场景,我需要在特定的时间间隔运行某个任务,但是,我希望能够在不重新实例化的情况下重置/重新启动计时器。这是我的代码,以便更好地理解。

private TimerTask beatTask = new TimerTask() {
@Override
public void run() {
beatDetected();
}
};

public void beatDetected() {
timeoutTimer.cancel();

// handle my stuff and restart the timer.

timeoutTimer.schedule(beatTask, 2000);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

(timeoutTimer = new Timer()).schedule(beatTask, 2000);

return Service.START_STICKY;
}

这个实现背后的想法是 beatDetected() 可以从外部事件调用,在这种情况下,下一个计时器滴答应该从那一刻开始,即下一个任务的耗时应该是重置。但是,我只得到第一个滴答声,从那时起,计时器就不起作用了。我不限于使用 Timer 类,任何可以解决上述情况的方法都可以。我正在考虑使用 postDelayed,但这段代码位于一个服务中,我真的不需要 UI 线程感知更新。

最佳答案

为计时器使用单独的线程在 Android 设备上被认为是一种不好的做法。那是因为在大多数情况下你会浪费资源。

如果您不需要超精确的计时事件,您应该使用基于Handler 的计时器。可以在此处看到此类计时器的示例:Repeat a task with a time delay? .这种方法适用于 Activity 和服务。

另请记住,如果设备进入休眠模式,则基于HandlerTimer 的计时器都将暂停。如果这不是您需要的,请使用 AlarmManager(但请记住,错误地使用 AlarmManager 可能会导调用池性能非常差)。


重置基于 Handler 的计时器:

 void resetRepeatingTask() {
mHandler.removeCallbacks(mBeatDetector);
mHandler.postDelayed(mBeatDetector, mInterval);
}

关于java - 带有重置选项的 Android java.util.Timer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8404736/

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