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

In Java (android), what is a good way to create accurate consecutive timers?

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

如果问题不清楚,背景信息: 为了练习编码,我想创建一个免费应用 w/o 广告来帮助练习自由潜水。基本思想是让多个计时器 运行 彼此相继。示例:

  1. 2 分钟呼吸
  2. 屏住呼吸2分钟
  3. 2 分钟呼吸
  4. 屏住呼吸2分+15秒
  5. 2 分钟呼吸
  6. 屏住呼吸2分+15秒+15秒 等等;通常 8 轮屏气导致 16 个连续计时器

起初我以为我可以使用计时器 class 但我不知道如何在计时器完成之前暂停代码。所以所有的计时器 运行 同时。 我读过 CountDownLatch 和 Handler,但我没有足够的经验来判断什么最适合我的目的。之前做了一个python版本,用了sleep。它工作正常,但对于较长的计时器,它会出现几秒钟的不准确,这是一个问题。

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

如有任何帮助/想法,我们将不胜感激。谢谢!

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

  1. 在定时器开始时保存系统时间。
  2. 将处理程序设置为 运行 每 100 毫秒(0.1 秒)并检查当前系统时间。
  3. 如果(当前时间-开始时间)>2000,进行下一步。

类似下面...

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);
    }
}

在你的 Activity 之类的地方:

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

startTimer(2000);


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