Java - 即时改变倒数计时器的速度

Java - Changing pace of CountDown Timer on the fly

我正在尝试在 Java 中制作一个简单的倒数计时器,它重复执行一组指令。我希望用户能够在代码为 运行 时实时控制该执行的频率(在 Android 上使用 SeekBar)。 到目前为止,这是我的尝试:

final CountDownTimer countDownTimer = new CountDownTimer(rsvp.wordsOfSentence.length * rsvp.pace, rsvp.pace) {

        @Override
        public void onTick(long millisInFuture) {
            targetTextView.setText(rsvp.wordsOfSentence[rsvp.getCurrentWord()]);
            rsvp.incrementCurrentWord();
        }


        @Override
        public void onFinish() {
            targetTextView.setText(rsvp.wordsOfSentence[rsvp.getCurrentWord()]);
        }

    };


seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            rsvp.setPace(progress);}
});

方法setPace()改变了int pace的值(两者都在classRSVP中设置,rsvp是这个class的一个对象)。所以我试图将步速传递给 CountDown Timer 作为参考,但我不确定我是否正确执行此操作。定时器执行代码,但用户无法控制频率。

提前致谢,如有不明之处请见谅,我刚开始玩 Java :)

如果您想坚持使用 CountDownTimer,您可以在搜索栏更改时执行此操作:

  • 停止当前倒数计时器
  • 以新的步调创建新的倒数计时器
  • 开始新的倒计时

或者,你可以使用Handler class的postDelayed方法在延迟后做一些动作,但是这个动作只做一次,所以你需要一次又一次地打电话。我认为这可以更轻松地更改速度,因为您可以在搜索栏更改时使用不同的毫秒数调用 postDelayed

我写了这个Timerclass,它利用了上面的方法:

public class Timer {
    private Handler handler;
    private boolean paused;

    private int interval;

    private Runnable task = new Runnable () {
        @Override
        public void run() {
            if (!paused) {
                runnable.run ();
                Timer.this.handler.postDelayed (this, interval);
            }
        }
    };

    private Runnable runnable;

    public int getInterval() {
        return interval;
    }

    public void setInterval(int interval) {
        this.interval = interval;
    }

    public void startTimer () {
        paused = false;
        handler.postDelayed (task, interval);
    }

    public void stopTimer () {
        paused = true;
    }

    public Timer (Runnable runnable, int interval, boolean started) {
        handler = new Handler ();
        this.runnable = runnable;
        this.interval = interval;
        if (started)
            startTimer ();
    }
}

您可以使用 getter 和 setter 轻松获取和设置 interval 字段。

用法:

Timer timer = new Timer(new Runnable() {
    @Override
    public void run() {
        // code to run in each tick of the timer here...
    }
 }, someInterval, true);
// the timer will start automatically if you pass true as the third argument.