Android-ListView中的CountDownTimer随机闪烁



我正在制作带有计时器的列表视图,每个计时器都有不同的截止日期,具体取决于数据库(类似于拍卖)

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个定时器同时运行

几个/所有倒计时将开始闪烁,无论是秒、分钟、小时还是天。

例如,我的一个计时器在27d 11h 54m 50s和0d 23h 47m 0s 之间闪烁

由于这种情况发生在模拟器和我的设备上,这似乎是我代码的缺陷,但我不知道是什么原因导致的。

我试图更改

holder.duration.setText(countdown)转换为holder.duration.setText(millisUntilFinished)

倒计时在所需的持续时间和一个巨大的随机数之间闪烁

请帮忙。

您应该使用一个TimerTask,并将所有UI更新放入单个计时器中,而不是为基本上相同的作业运行多个CountDownTimer,因为您已经在进行所有的计算以确定任何特定项目的"时间到了",您可能只运行一个TimerTask,然后每秒更新一次所有内容。CountDownTimer对于单个实现倒计时很有用,因为它可以进行一些内置的计算等。您正在重做所有这些计算,所以您还不如使用一个常规TimerTask的实例。

CountDownTimer的实现依赖于Handler消息传递中的调度延迟。一个倒计时实例不太可能导致任何奇怪的行为,但如果你有几个实例在系统时钟每秒到达时都应该"滴答"作响(以毫秒为单位的时间以"000"结束——每秒一次,并且都在同一时间),那么这些处理程序都会试图同时启动,但不可避免地会失败。

如果UI或其他进程可能会延迟其中的一些消息,甚至到了"跳过刻度"来赶上的地步。此外,这意味着下一条消息的延迟可能距离下一个刻度只有几毫秒(即,如果它应该每1000毫秒检查一次,但又延迟了1990毫秒,那么它将跳过一个刻度,并将下一条信息安排在未来10毫秒。

最新更新