android timer修改时间后失效,android CountDownTimer – 最后onTick未调用 – 使用什么干净的解决方案?...

沮丧的帖子….

我偶然发现了许多人在这里报道的“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";

@Override

public 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行)并删除此限制以获得最终的刻度回调.

标签:countdown,android,timer

来源: https://codeday.me/bug/20191006/1858256.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值