小编典典

Android-ListView中的CountDownTimer随机闪烁

java

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

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)

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

请帮忙。


阅读 396

收藏
2020-11-30

共1个答案

小编典典

您应该使用一个TimerTask,并将所有UI更新放入该单个计时器中,而不是CountDownTimer为基本相同的任务运行多个s,因为您已经在做所有数学运算以确定任何特定项目的“时间到了”,您可能只运行一个TimerTask并每秒更新一次。CountDownTimer对于单个实现倒计时很有用,因为它会执行一些内置数学运算,等等。您正在重做所有数学运算,因此您最好使用一个regular实例TimerTask

CountDownTimer在处理程序消息传递中按计划的延迟实现中继。单个倒计时实例不太可能导致任何奇怪的行为,但是如果您有多个实例,那么所有这些都应该在系统时钟每秒命中时“滴答”(以毫秒为单位的时间以“
000”结尾-每秒一次,所有同时),那么这些处理程序都会尝试同时触发,并且不可避免地会失败。

如果UI或其他进程可能会延迟其中的某些消息,甚至达到“跳过刻度”以追赶的程度。同样,这意味着下一条消息的延迟可能仅距下一个刻度线的毫秒数(即,如果应该每隔1000毫秒检查一次,但又延迟了1990毫秒,则它将跳过一个刻度线,并将下一条消息安排为10迈尔斯进入未来。

2020-11-30