Android - ListView中的CountDownTimer随机闪烁

时间:2014-01-26 20:22:49

标签: java android listview

我正在使用计时器制作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)

并且倒计时在所需的持续时间和巨大的随机数之间闪烁,

请帮忙。

1 个答案:

答案 0 :(得分:0)

您应该使用一个TimerTask并将所有UI更新放入该单个计时器,而不是运行多个CountDownTimer来执行基本相同的工作,因为您已经在进行所有数学运算以确定何时“ “对于任何特定项目,您可能只运行一个TimerTask并且每秒运行一次更新所有内容。 CountDownTimer对于单个实现倒计时非常有用,因为它会执行一些内置数学等等。您正在重做所有数学运算,因此您不妨使用常规TimerTask的一个实例。 / p>

CountDownTimer实现Handler消息传递中的预定延迟。单个倒计时实例不太可能导致任何奇怪的行为,但是如果你有几个所有应该在系统时钟每秒击中时“滴答”(以毫秒结束的时间以“000”结束 - 每秒一次,并且所有在同一时间),然后那些处理程序将全部尝试同时开火并且不可避免地失败。

如果用户界面或其他进程可能会延迟其中一些消息,甚至可能会“跳过滴答”以赶上。此外,这意味着下一个消息延迟可能只是从下一个滴答开始的毫秒(即,如果它应该检查每1000毫秒,但是延迟了额外的1990毫秒,那么它将跳过一个滴答并且还安排下一个消息为10毫无疑问。