0

我正在尝试实现一个 CountDownTimer 来发布可视文本倒计时,直到我到达 0,然后发送特定消息。一切正常,直到我达到 3 秒,它调用了我的 done() 方法两次;一次还剩 3 秒,一次在计数器完成时。

我确信调用 done() 的唯一时间是调用此 CountDownTimer() 中的 onFinish() 时。我不知道为什么它会调用两次,并且始终同时调用。

我的 Java 代码:

mainCounter = new CountDownTimer(30000, 1000){
@Override
public void onTick(long millisUntilDone){
    int hours = (int) (millisUntilDone/3600000);
    int mins = 0, secs = 0;
    long timeLeft = millisUntilDone % 3600000;
    if((int)timeLeft != 0){
        mins = (int) (timeLeft/60000);
    }
    long timeLeftStill = timeLeft % 60000;
    if((int)timeLeftStill != 0){
        secs = (int) (timeLeftStill/1000);
    }

    ((TextView)findViewById(R.id.timer_label)).setText("You have " + hours + " hours, " + mins + " mins, " + secs + " secs left");
    }

    @Override
    public void onFinish() {
    // Send Message, Out of Time
    ((TextView)findViewById(R.id.timer_label)).setText("MESSAGE!");
        num++;
        done();  //My Own Method
        this.cancel();
    }
}.start();

我有另一个可以完美运行的计数器,我已将其注释掉以确保它不会影响此计数器,就像我说的那样,这个计数器可以正常工作,直到我剩下 3 秒。

4

2 回答 2

1

对于您onFinish()在剩下 3 秒时调用方法的问题,您应该在此处阅读答案。实际上,您应该阅读Android 上的所有答案:CountDownTimer 跳过最后一个 onTick()!问题。它会帮助你理解原因。谈论那个线程,通常人们在完成被调用时遇到问题。比预计时间早 1 秒。对于他们来说,可以理解(从引用的答案中)在每个刻度开始时,在调用 onTick() 之前,计算倒计时结束的剩余时间。如果此时间小于倒计时时间间隔,则不再调用 onTick。但是那里的答案还指出,后台可能有其他进程延迟了运行 CountDownTimer 的线程,而且 Android 本身在调用 CountDownTimer 的消息处理程序时可能会产生一个小的延迟,所以你不希望的延迟可能是因为所有这些。

答案中几乎没有提出解决方法。一种是减少间隔时间或增加最大 countDownTimer 值。还有一种替代countDownTimer方法。希望这可以帮助您了解可能的原因,并帮助您解决问题。

于 2013-06-01T00:59:02.237 回答
0

你可以这样做

    private int secondsLeft = 0;
    private int minutes;
    private int seconds;
    private String timeString;

counter = new CountDownTimer(30000, 100) {
            public void onTick(long ms) {
                if (Math.round((float) ms / 1000.0f) != secondsLeft) {
                    secondsLeft = Math.round((float) ms / 1000.0f);
                    minutes = (secondsLeft % 3600) / 60;
                    seconds = secondsLeft % 60;
                    timeString = String.format("%02d:%02d", minutes, seconds);
                    textViewTimer.setText(timeString);
                }
            }
            public void onFinish() {
                textViewTimer.setText("00:00");
            }
        }.start();
于 2018-05-10T05:46:41.300 回答