计时器时间表传递奇怪的数字

时间:2016-09-03 07:09:58

标签: java android

我在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()返回负数,整个计算的结果仍然是正数。我忽略了什么吗?

2 个答案:

答案 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