
沮丧的帖子….
我偶然发现了许多人在这里报道的“CountDownTimer – 最后onTick not called”问题.
简单的演示显示问题
package com.example.gosh;import androID.app.Activity;import androID.os.Bundle;import androID.os.CountDownTimer;import androID.util.Log;public class CountDownTimerSucksActivity extends Activity {int IDontWantThis = 0; // choose 100 and it works yet ...private static final String TAG = "CountDownTimerSucksActivity";@OverrIDepublic voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.main); new MyCountDownTimer(10000 + IDontWantThis , 1000).start();}class MyCountDownTimer extends CountDownTimer { long startSec; public MyCountDownTimer(long millisInFuture, long countDownInterval) { super(millisInFuture, countDownInterval); // Todo auto-generated constructor stub startSec = System.currentTimeMillis() ; } @OverrIDe public voID onFinish() { // Todo auto-generated method stub Log.e(TAG, " onFinish (" + getSeconds() + ")"); } @OverrIDe public voID onTick(long millisUntilFinished) { // Todo auto-generated method stub Log.e(TAG, millisUntilFinished + " millisUntilFinished" + " (" + getSeconds() + ")"); } protected long getSeconds() { return (((System.currentTimeMillis() - startSec) / 1000) % 60); }}}测试运行的logcat输出……
正如你所看到的那样,最后一次调用onTick发生在1963毫秒millisUntilFinished,然后下一个调用将在2秒后完成.肯定是一个有缺陷的行为.我发现很多帖子还没有干净的解决方案.我在源代码中包含的一个,如果你将IDontWantThis字段设置为100就可以了.
我不介意在小字段中的解决方法,但这似乎是一个核心功能,我不能理解它还没有修复.你们有什么人为此做一个干净的解决方案?
非常感谢
马丁
更新:
Sam的CountDownTimer的一个非常有用的修改,它不会因内部ms延迟而抑制最后一次滴答,并且还可以防止每次滴答随时间推移的ms延迟累积.
解决方法:
您遇到的行为实际上是在CountdownTimer代码中明确定义的; have a look at the source.
请注意handleMessage()内部,如果剩余时间小于间隔,则显式不会调用onTick(),只会延迟直到完成.
但是请注意,CountdownTimer只是Handler上的一个非常薄的包装器,它是AndroID框架的真正计时组件.作为一种解决方法,您可以非常轻松地从此源创建自己的计时器(少于150行)并删除此限制以获得最终的刻度回调.
总结以上是内存溢出为你收集整理的android CountDownTimer – 最后onTick未调用 – 使用什么干净的解决方案?全部内容,希望文章能够帮你解决android CountDownTimer – 最后onTick未调用 – 使用什么干净的解决方案?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)