Code:
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();
}
Output:
还剩 10 秒
还剩 8 秒
还剩 6 秒
还剩 4 秒
完毕!
问题:
我如何让它显示“还剩 2 秒“?经过的时间确实是10秒,但最后的onTick()永远不会发生。如果我将第二个参数从2000更改为1000,那么这就是输出:
还剩 10 秒
还剩 9 秒
还剩 8 秒
还剩 7 秒
还剩 6 秒
还剩 5 秒
还剩 4 秒
还剩 3 秒
还剩 2 秒
Done!
所以你看,它似乎跳过了最后一个 onTick() 调用。顺便说一句,XML 文件基本上是默认的 main.xml,其中 TextView 分配了 idtv并将文本设置为“”。
我检查了CountDownTimer的源代码。 “缺失的刻度”来自 CountDownTimer 的一个特殊功能,我尚未在其他地方看到该功能的记录:
在每个报价开始时,在调用 onTick() 之前,计算倒计时结束之前的剩余时间。如果这个时间小于倒计时时间间隔,则onTick为not不再打电话了。相反,仅安排下一个时间点(将调用 onFinish() 方法)。
鉴于硬件时钟并不总是超级精确,后台可能有其他进程延迟运行 CountDownTimer 的线程,而且 Android 本身在调用 CountDownTimer 的消息处理程序时可能会产生一个小延迟,因此很可能倒计时结束前最后一个刻度的调用将至少延迟一毫秒,因此 onTick() 将不会被调用。
对于我的应用程序,我只需将刻度间隔“稍微”变小(500 毫秒)就解决了这个问题
myCountDownTimer = new CountDownTimer(countDownTime, intervalTime - 500) {
...
}
我可以让我的代码保持原样。对于间隔时间长度至关重要的应用程序,此处发布的其他解决方案可能是最好的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)