java countdowntimer_java – android countdowntimer tick不准确

我知道这是一个老问题 – 但我也遇到了这个问题,并认为我会分享我的解决方案.

看起来CountDownTimer不是很准确,所以我决定使用java.util.Timer实现更精确的倒计时器:

public abstract class PreciseCountdown extends Timer {

private long totalTime, interval, delay;

private TimerTask task;

private long startTime = -1;

private boolean restart = false, wasCancelled = false, wasStarted = false;

public PreciseCountdown(long totalTime, long interval) {

this(totalTime, interval, 0);

}

public PreciseCountdown(long totalTime, long interval, long delay) {

super("PreciseCountdown", true);

this.delay = delay;

this.interval = interval;

this.totalTime = totalTime;

this.task = getTask(totalTime);

}

public void start() {

wasStarted = true;

this.scheduleAtFixedRate(task, delay, interval);

}

public void restart() {

if(!wasStarted) {

start();

}

else if(wasCancelled) {

wasCancelled = false;

this.task = getTask(totalTime);

start();

}

else{

this.restart = true;

}

}

public void stop() {

this.wasCancelled = true;

this.task.cancel();

}

// Call this when there's no further use for this timer

public void dispose(){

cancel();

purge();

}

private TimerTask getTask(final long totalTime) {

return new TimerTask() {

@Override

public void run() {

long timeLeft;

if (startTime < 0 || restart) {

startTime = scheduledExecutionTime();

timeLeft = totalTime;

restart = false;

} else {

timeLeft = totalTime - (scheduledExecutionTime() - startTime);

if (timeLeft <= 0) {

this.cancel();

startTime = -1;

onFinished();

return;

}

}

onTick(timeLeft);

}

};

}

public abstract void onTick(long timeLeft);

public abstract void onFinished();

}

用法示例如下:

this.countDown = new PreciseCountdown(totalTime, interval, delay) {

@Override

public void onTick(long timeLeft) {

// update..

// note that this runs on a different thread, so to update any GUI components you need to use Activity.runOnUiThread()

}

@Override

public void onFinished() {

onTick(0); // when the timer finishes onTick isn't called

// count down is finished

}

};

要开始倒计时,只需调用countDown.start().

countDown.stop()停止countDown,可以使用countDown.restart()重新启动.

希望这对未来的任何人都有帮助.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值