在Java(android)中,创建准确的连续计时器的好方法是什么?

时间:2016-09-05 04:55:37

标签: java android timer countdown

在Java / android中拥有多个连续计时器的最准确解决方案是什么?或者换句话说,在当前计时器完成之前,延迟下一段代码的最佳选择是什么?

背景资料如果问题不清楚: 为了练习编码,我想创建一个没有广告的免费应用程序,以帮助练习自由潜水。基本思想是让几个计时器相继运行。例如:

  1. 2分钟呼吸
  2. 屏住呼吸2分钟
  3. 2分钟呼吸
  4. 屏住呼吸2分钟+15秒
  5. 2分钟呼吸
  6. 屏住呼吸2分钟+15秒+15秒 等等;通常8轮呼吸持续导致16个连续计时器
  7. 起初我以为我可以使用计时器类,但我不知道在计时器完成之前如何暂停代码。所以所有的计时器同时运行。 我已经阅读了有关CountDownLatch和Handler的内容,但我没有足够的经验来判断什么才是最适合我的目的。之前我做了一个python版本并使用了sleep。它运行良好,但对于较长的计时器,它是不准确的几秒钟,这是一个问题。

    我相信另一种选择是使用常规计时器,但运行一个while循环,直到显示的文本== 0.我不知道这个无限循环是否会使应用程序崩溃,干扰计时器的准确性或有任何其他负面影响。

    任何帮助/想法将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

我建议你每隔几毫秒检查一次系统时间 您可以通过System.currentTimeMillis()Handler获得相同的效果。

  1. 在计时器开始时保存系统时间。
  2. 将Handler设置为每100 ms运行一次(0.1秒)并检查当前的系统时间。
  3. 如果(当前时间 - 开始时间)> 2000年,继续下一步。

  4. 如下所示...

    class TimerHandler extends Handler
    {
        private long start;
        private long timeGap;
    
        public void set(long gap)
        {
            start = System.currentTimeMillis();
            this.timeGap = gap;
        }
    
        @Override
        public void handleMessage(Message msg)
        {
            long curr = System.currentTimeMillis();
            if(curr - start > timeGap)
            {
                // do what you want.
                // If you want your timer to keep on running,
                // reset start.
            }
    
            // send Next Message after 100 ms.
            sendEmptyMessageDelayed(-1, 100);
        }
    }
    

    在您的活动或其他内容中:

    public void startTimer(long gap)
    {
        TimerHandler handler = new TimerHandler();
        handler.set(gap);
        handler.sendEmptyMessageDelayed(-1, 100);
    }
    
    startTimer(2000);
    


    请注意,您可以在调用sendEmptyMessageDelayed()时使用小的nextTimer来减少错误,但这会导致您的操作系统更频繁地检查您的线程,这不是一个好主意。