我正在使用计时器制作listview,每个计时器的截止日期不同,具体取决于数据库(类似于拍卖)
Time now = new Time();
now.setToNow();
now.normalize(true);
nowMillis = now.toMillis(true);
.
.
String endtime = a.get(position).get(TAG_ENDTIME);
Integer timeSecond = Integer.parseInt(endtime.substring(17, 19));
Integer timeMinute = Integer.parseInt(endtime.substring(14, 16));
Integer timeHour = Integer.parseInt(endtime.substring(11, 13));
Integer timeDay = Integer.parseInt(endtime.substring(0, 2));
Integer timeMonth = Integer.parseInt(endtime.substring(3, 5)) - 1;
Integer timeYear = Integer.parseInt(endtime.substring(6, 10));
Time future = new Time();
future.set(timeSecond, timeMinute, timeHour, timeDay, timeMonth, timeYear);
future.normalize(true);
long futureMillis = future.toMillis(true);
long interval = futureMillis - nowMillis;
new CountDownTimer(interval,1000)
{
@Override
public void onTick(long millisUntilFinished)
{
Long interval = millisUntilFinished;
int days = (int) ((millisUntilFinished / 1000) / 86400);
int hours = (int) (((millisUntilFinished / 1000) - (days * 86400)) / 3600);
int minutes = (int) (((millisUntilFinished / 1000) - (days * 86400) - (hours * 3600)) / 60);
int seconds = (int) ((millisUntilFinished / 1000) % 60);
String countdown = String.format("%dd %dh %dm %ds", days, hours, minutes, seconds);
holder.duration.setText(countdown);
}
@Override
public void onFinish()
{
// TODO Auto-generated method stub
holder.duration.setText(TimeUp);
}
}.start();
当只有一个实例时,该代码几乎完美无缺。
然而,当有多个实例,同时运行4-5个定时器时会出现问题
几个/所有倒计时将开始闪烁,无论是秒,分钟,小时还是几天。
e.g。我的一个计时器闪烁在27d 11h 54m 50s和0d 23h 47m 0s之间
由于这在模拟器和我的设备上都会发生,这似乎是我的代码的缺陷,但我不知道是什么原因造成的。
我试图改变
holder.duration.setText(countdown)
加入holder.duration.setText(millisUntilFinished)
并且倒计时在所需的持续时间和巨大的随机数之间闪烁,
请帮忙。
答案 0 :(得分:0)
您应该使用一个TimerTask
并将所有UI更新放入该单个计时器,而不是运行多个CountDownTimer
来执行基本相同的工作,因为您已经在进行所有数学运算以确定何时“ “对于任何特定项目,您可能只运行一个TimerTask
并且每秒运行一次更新所有内容。 CountDownTimer
对于单个实现倒计时非常有用,因为它会执行一些内置数学等等。您正在重做所有数学运算,因此您不妨使用常规TimerTask
的一个实例。 / p>
CountDownTimer
实现Handler消息传递中的预定延迟。单个倒计时实例不太可能导致任何奇怪的行为,但是如果你有几个所有应该在系统时钟每秒击中时“滴答”(以毫秒结束的时间以“000”结束 - 每秒一次,并且所有在同一时间),然后那些处理程序将全部尝试同时开火并且不可避免地失败。
如果用户界面或其他进程可能会延迟其中一些消息,甚至可能会“跳过滴答”以赶上。此外,这意味着下一个消息延迟可能只是从下一个滴答开始的毫秒(即,如果它应该检查每1000毫秒,但是延迟了额外的1990毫秒,那么它将跳过一个滴答并且还安排下一个消息为10毫无疑问。