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

标签 java android reference countdowntimer

我正在尝试用 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的值(都是在RSVP类中设置的,rsvp是这个类的一个对象)。所以我试图将步速传递给 CountDown Timer 作为引用,但我不确定我是否正确执行此操作。定时器执行代码,但用户无法控制频率。

提前致谢,如果有什么不清楚的地方请原谅我,我刚开始玩 Java :)

最佳答案

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

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

或者,您可以使用 Handler 类的 postDelayed延迟后执行某些操作的方法,但这只执行一次操作,因此您需要一次又一次地调用它。我认为这可以更轻松地更改速度,因为您可以在搜索栏更改时使用不同的毫秒数调用 postDelayed

我已经编写了这个使用上述方法的小 Timer 类:

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.

关于Java - 即时改变倒数计时器的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48993795/

相关文章:

java - Java 中的 Neo4j 服务器模式

objective-c - 在 C 中取消引用二维数组指针

java - 什么样的设计模式适合我的需要?

Android @Intdef 用于标记如何使用它

Android : 5. 0 : WebChromeClient. FileChooserParams 无法解析为类型

java - 为什么主构造函数主体在字段初始化之前执行?

python - 在 python 字典中赋值(复制与引用)

Vb.net Property 获取和设置没有私有(private)变量的值

java - 使用 java DocumentBuilder 从 xml feed 获取 rel ="alternate"href 值

java - 使用java安装mysql