当前位置: 首页 > 面试题库 >

Android-ListView中的CountDownTimer随机闪烁

梁丘扬
2023-03-14
问题内容

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

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为基本相同的任务运行多个s,因为您已经在做所有数学运算以确定任何特定项目的“时间到了”,您可能只运行一个TimerTask并每秒更新一次。CountDownTimer对于单个实现倒计时很有用,因为它会执行一些内置数学运算,等等。您正在重做所有数学运算,因此您最好使用一个regular实例TimerTask

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

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



 类似资料:
  • 问题内容: 我有一个拥有大量下载量的应用程序,并且收到很多此错误消息: 正如您在堆栈跟踪中所看到的,其中没有一行包含我的代码跟踪。为了重现这一点,我很幸运地找到了一个使用Froyo(2.2 p7)的用户,而我只是向下滚动了代码中的s 之一。经过一些随机的时间后,它只是冻结了此异常。每次在不同的时间发生。 它后面有一个,只是增加了越来越多的行。显然,当我进行“过度滚动”时会收到此错误,但我什至无法想

  • 问题内容: 对CountDownTimer有疑问。我必须制作一个应用程序,允许用户每次单击按钮都将时间增加+1。然后,在停止单击按钮后,它会等待三秒钟,然后开始倒计时。 我在下面粘贴了我的代码。 我的问题是:我似乎无法使数字递增正常工作,但是似乎在停止递增数字(onStop())之后,它直接转到了(onFinish())。而不是转到OnTick()并每秒减少1。我已经尝试了多种方法来解决此问题,但

  • 问题内容: 当我通过按BACK按钮(调用onBackPressed())关闭应用程序时,它不会停止,直到完成计数为止。我怎样才能把 cancel(); 在我的? 因为,当我退出应用程序时(如下面的说明所示),我不再想要在屏幕上进行举杯了。 在我的代码之上: 我的是什么: 方法 谢谢。 问题答案: 创建一个例如的全局对象。 在main_activity类的顶部设置:之后,执行以下操作。 并呼吁像

  • 我发现了一个非常有趣的问题。在拍摄相机照片后(我将设备保持在纵向模式,不旋转),给定的照片有时会旋转,但并不总是旋转。我知道,有些设备总是提供旋转的照片,但它可以使用exif或mediastore信息进行旋转。但在这种情况下,exif和mediastore表示方向为0,但图像是旋转的。最令人沮丧的是,这完全是随机发生的。代码非常简单: 有人见过这个问题吗?我在操作系统更新(4.1.1)后体验了Ga

  • 本文向大家介绍Android倒计时神器(CountDownTimer),包括了Android倒计时神器(CountDownTimer)的使用技巧和注意事项,需要的朋友参考一下 Android倒计时神器 - CountDownTimer,供大家参考,具体内容如下 啥是CountDownTimer?​ CountDownTimer是Andorid.os包下一个谷歌为我们封装好的一个倒计时工具。我们吗、

  • 我想看看哪个随机数生成器包在我的神经网络中更快。 我目前正在更改github的一个代码,其中两个都是numpy。随机和随机包用于生成随机整数、随机选择、随机样本等。 我之所以更改此代码,是因为出于研究目的,我希望设置一个全局种子,以便能够比较超参数不同设置的精度性能。问题是,现在我必须为随机包和numpy包设置两个全局种子。理想情况下,我只想设置一个种子,因为来自两个随机数生成器序列的图形可能会更