我在Android Activity
中有一些代码,它运行一个计时器,以便每分钟更新一个UI元素。启动计时器的代码在onResume()中调用,如下所示:
timerTask = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
updateUtc();
}
});
}
};
// update the time at the next time the minute rolls over
long delay = 61000 - System.currentTimeMillis() % 60000L;
timer.scheduleAtFixedRate(timerTask, delay, 60000L);
我在这个应用程序中记录了错误,抛出异常:
java.lang.IllegalArgumentException: Illegal delay to start the TimerTask: -1560105959000
at java.util.Timer.scheduleImpl(Timer.java:567)
at java.util.Timer.scheduleAtFixedRate(Timer.java:528)
我无法看到我的代码可能会产生如此大的负数。即使currentTimeMillis()
返回负数,整个计算的结果仍然是正数。我忽略了什么吗?
答案 0 :(得分:1)
好吧,我找到了答案。例外文本具有误导性。 scheduleAtFixedRateImpl()
的代码如下所示:
long when = delay + System.currentTimeMillis();
if (when < 0) {
throw new IllegalArgumentException("Illegal delay to start the TimerTask: " + when);
因此,打印的值不是延迟,而是通过将延迟添加到当前系统时间计算的绝对时间。如果系统的日期设置为1970年之前,currentTimeMillis()
将返回一个负数。所以简短的回答是,如果设备的日期早于1970年,您就无法使用Android计时器功能。
答案 1 :(得分:0)
我认为在减法之前处理Modulo。所以这可能会成功:
( 61000 - System.currentTimeMillis() ) % 60000L