gpt4 book ai didi

java - Android:CountDownTimer 跳过最后一个 onTick()!

转载 作者:IT老高 更新时间:2023-10-28 20:39:47 25 4
gpt4 key购买 nike

代码:

public class SMH extends Activity {  

public void onCreate(Bundle b) {
super.onCreate(b);
setContentView(R.layout.main);

TextView tv = (TextView) findViewById(R.id.tv);

new CountDownTimer(10000, 2000) {
public void onTick(long m) {
long sec = m/1000+1;
tv.append(sec+" seconds remain\n");
}
public void onFinish() {
tv.append("Done!");
}
}.start();
}

输出:
还剩 10 秒
还剩 8 秒
还剩 6 秒
还剩 4 秒
完毕!

问题:

如何让它显示“还剩 2 秒”?耗时确实是 10 秒,但最后一次 onTick() 从未发生。如果我将第二个参数从 2000 更改为 1000,那么这是输出:

还剩 10 秒
还剩 9 秒
还剩 8 秒
还剩 7 秒
还剩 6 秒
还剩 5 秒
还剩 4 秒
还剩 3 秒
还剩 2 秒
完毕!

所以你看,它似乎跳过了最后一次 onTick() 调用。顺便说一句,XML 文件基本上是默认的 main.xml,TextView 的 ID 为 tv,文本设置为“”。

最佳答案

我查看了 CountDownTimer 的源代码。 “丢失的滴答声”来自 CountDownTimer 的一个特殊功能,我还没有看到在其他地方记录:

在每个刻度开始时,在调用 onTick() 之前,会计算到倒计时结束的剩余时间。如果此时间小于倒计时时间间隔,则不再调用 onTick。而是只安排下一个滴答声(将调用 onFinish() 方法)。

鉴于硬件时钟并不总是非常精确,后台可能有其他进程延迟运行 CountDownTimer 的线程加上 Android 本身在调用 CountDownTimer 的消息处理程序时可能会产生一个小的延迟倒计时结束前最后一次滴答的调用很可能会延迟至少一毫秒,因此不会调用 onTick()。

对于我的应用程序,我通过将滴答间隔“稍微”小一些(500 毫秒)解决了这个问题

    myCountDownTimer = new CountDownTimer(countDownTime, intervalTime - 500) {
...
}

我可以保持我的代码不变。对于间隔时间长度至关重要的应用程序,此处发布的其他解决方案可能是最好的。

关于java - Android:CountDownTimer 跳过最后一个 onTick()!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8857590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com