如何在CountDownTimer内定期调用方法?

时间:2016-05-14 07:44:03

标签: java android

我的代码的作用:我的活动有一个CountDownTimer,当用户按下按钮时会启动。完成后,播放声音。这是代码:

public class PrepTimer extends CountDownTimer {
    public PrepTimer(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
    }

    @Override
    public void onTick(long millisUntilFinished) {
        updateSessionRemaining(millisUntilFinished);
        setPrepDigits(millisUntilFinished);
    }

    @Override
    public void onFinish() {
        session.setPrepRemaining(0);
        playSound();
    }
}

我想要它做什么:我希望在定时器的过程中定期播放声音(除了最后)。例如,在十分钟计时器中,声音可能每60秒播放一次。

我尝试过的事情:

  • if方法中使用onTick语句检查millisUntilFinished何时等于某个值(例如,60秒的倍数),然后运行该方法。这似乎是最直接的解决方案,但我发现该方法不是一致触发的(也许millisUntilFinished正在跳过我正在检查它的值?)。
  • 创建单独的嵌套CountDownTimers并重复for循环。这个问题是代码很快变得过于复杂,我的直觉告诉我,我不应该在定时器中运行定时器。

问题:如何在CountDownTimer的过程中定期运行方法?

2 个答案:

答案 0 :(得分:0)

而不是使用倒数计时器,你可以简单地使用一个延迟后处理程序和线程。在方法结束时使用指定的时间间隔发布处理程序,如下面的代码

Runnable myThread = new Runnable() {
    @Override
    public void run() {
        //call the method here
        myHandler.postDelayed(myThread, 1000);//calls thread after 60 seconds
    }
};
myHandler.post(myThread);//calls the thread for the first time

答案 1 :(得分:0)

在考虑了一段时间之后,我想出了一个满足我对简单性的主要要求的解决方案。以下是如何使用它:

声明两个类级变量

private long startTime = 60000; // Set this equal to the length of the CountDownTimer
private long interval = 10000; // This will make the method run every 10 seconds  

声明在CountDownTimer

内的间隔运行的方法
private void runOnInterval(long millisUntilFinished) {
    if (millisUntilFinished < startTime) {
        playSound();
        startTime -= interval;
    }
}

然后使用onTick

CountDownTimer方法调用该方法
// ...
@Override
    public void onTick(long millisUntilFinished) {
        runOnInterval(millisUntilFinished);
    }
// ...

以下是它的工作原理:每次onTick的{​​{1}}方法都会CountDownTimer传递millisUntilFinished。然后runOnInterval()检查该值是否小于startTime。如果是,则运行if语句中的代码(在我的情况下为playSound()),然后将startTime减去interval的值。 millisUntilFinished再次低于startTime后,流程将重新开始。

上述代码比使用其他CountDownTimerHandlerRunnable更简单。它还可以自动使用可能添加到活动中的任何类型的功能来处理CountDownTimer暂停和重置。