繁体   English   中英

Android 中的 CountDownTimer 使用 Java

[英]CountDownTimer in Android using Java

我正在尝试在 android 中实现一个计时器。 我正在使用倒数计时器。 这是定时器代码:

 new CountDownTimer(totalTime * 1000, 1000) {
        @Override
        public void onTick(long l) {
            int newSec = (int) (sec - (sec - (l / 1000)));
            if(l % 60 == 0) {
                min--;
            }
            if(newSec < 10) {
                tv_timer.setText(min + ":" + z + newSec);
            } else {
                tv_timer.setText(min + ":" + newSec);
            }
        }

        @Override
        public void onFinish() {
            mediaPlayer.start();
        }
    }.start();

计时器不断更新用户屏幕上的剩余时间。

问题是定时器一直在 00:01(1 秒)结束,它从不显示 00:00,并且在定时器结束后 2 秒响铃。

如何显示 00:00 以及如何在计时器结束后立即响起警报音?

这是搜索条码。 用户使用搜索栏来设置计时器:

seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
            z = 0;
            min = i / 60;
            sec = i - min * 60;
            if(sec < 10) {
                tv_timer.setText(min + ":" + z + sec);
            } else {
                tv_timer.setText(min + ":" + sec);

            }
            totalTime = i;
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

CountDownTimer 文档中所示

onTick(长毫秒UntilFinished)

millisUntilFinished long:直到完成的时间量。

这意味着 00:00 永远不会显示在您的代码中,因为当没有时间完成时不会调用onTick

只需在onFinish中显示 00:00

@Override
        public void onFinish() {
            tv_timer.setText("00:00");
            mediaPlayer.start();
        }

关于闹钟铃声,似乎是倒计时结束后立即响起。 您必须检查音调本身在开始时没有一两秒钟的静音。

跟进@ShadySherif 的(正确)答案,添加一些基本日志记录将有助于理解行为并突出显示代码中的可疑语句。

片段:

// Countdown 10 seconds providing an update every second until finished.
new CountDownTimer(10 * 1000, 1000) {
    @Override
    public void onTick(long millisUntilFinished) {
       Log.d("sotest",Long.toString(millisUntilFinished));
    }

    @Override
    public void onFinish() {
        Log.d("sotest","Finish");
    }
}.start();

日志(请注意, millisUntilFinished值每次运行都会有所不同):

2020-07-10 09:32:46.628 9087-9087/calculations D/sotest: 9986
2020-07-10 09:32:47.629 9087-9087/calculations D/sotest: 8985
2020-07-10 09:32:48.630 9087-9087/calculations D/sotest: 7983
2020-07-10 09:32:49.633 9087-9087/calculations D/sotest: 6981
2020-07-10 09:32:50.636 9087-9087/calculations D/sotest: 5978
2020-07-10 09:32:51.640 9087-9087/calculations D/sotest: 4974
2020-07-10 09:32:52.643 9087-9087/calculations D/sotest: 3970
2020-07-10 09:32:53.647 9087-9087/calculations D/sotest: 2967
2020-07-10 09:32:54.650 9087-9087/calculations D/sotest: 1964
2020-07-10 09:32:55.653 9087-9087/calculations D/sotest: 961
2020-07-10 09:32:56.616 9087-9087/calculations D/sotest: Finish

一个可疑的陈述是这样的:

// Incorrect, this performs:
//   "every time the millisUntilFinished value is a multiple of 60,
//   decrement what most likely is a minute value."
if(l % 60 == 0) {
    min--;
}

因此,您似乎正试图通过对毫秒值执行取模来保持分钟值(其中也有错误)。 这是不正确的。

所以重点是简单的日志记录可以极大地帮助理解问题。

此外,从日志中您可以看到一个有趣的行为,即值的“漂移”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM