【问题标题】:Program works great with CountDownTimer until there are 3 seconds left, then it calls twice程序与 CountDownTimer 一起工作得很好,直到剩下 3 秒,然后它调用了两次
【发布时间】:2013-06-01 00:00:43
【问题描述】:

我正在尝试实现一个 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 秒。

【问题讨论】:

  • Trail.java 文件中的178 行是什么?你的应用程序中有一些 GPS 的东西吗?为什么要拨打OnLocationChange
  • 第 178 行是另一个 ((TextView)findViewById(R.id.locat_label)).setText("Other message!");我打算在它说是第 100 行的地方添加 LogCat,但不小心添加了它被注释掉的地方。是的,我正在以速度工作。
  • 如果不是您想要显示的,请添加正确的。
  • 已修复,字面意思是完全相同的,只是第 100 行而不是第 178 行
  • 好的。谢谢 :)。只是好奇你为什么要覆盖这些方法?

标签: java android nullpointerexception textview findviewbyid


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复,我会看看。我遇到的问题不一定是它被提前调用是一小时中有 3 秒并不意味着太多。事实上,它被调用了两次,即使它应该只被调用一次。希望您的链接有所帮助。感谢您的宝贵时间。
  • 我很想知道为什么会这样。因此,如果您得到答案,请发表评论。 :)。万事如意!
  • 现在我已经实现了一些有趣的变通方法,它们效果很好,但在代码中看起来很糟糕哈哈。我还没有机会阅读它,当我弄清楚问题出在哪里时,我一定会更新。再次感谢。
【解决方案2】:

你可以这样做

    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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-05
    • 2016-05-11
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多