繁体   English   中英

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

[英]Android java.util.Timer with reset option

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

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,但是此代码位于Service中,并且我真的不需要UI线程感知更新。

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

如果不需要超精确的定时事件,则应使用基于Handler的计时器。 这样的计时器的示例可以在这里看到: 重复执行某个任务有时间延迟吗? 此方法适用于活动和服务。

也请记住,这两个HandlerTimer ,如果设备进入休眠模式定时器基础将暂停。 如果这不是您需要的,请使用AlarmManager (但请记住,错误使用AlarmManager可能会导致电池性能非常差)。


重置基于Handler的计时器:

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

接受的答案不起作用(至少不适用于我)。

一个简单的解决方案是使用Timer触发TimerTask ,可以轻松将其重置。

Log.d(TAG, "Restarting timer");
if (timer != null) {
    timer.cancel();
}
timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        Log.d(TAG, "Run the task");
    }
}, 1000);

请注意,每次重置计时器都必须创建一个新的TimerTask您不能重用旧的计时器任务。 如果要保留状态,则需要获取计时器任务以运行单独的任务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM