我正在使用计时器制作列表视图,每个计时器都有不同的截止日期,具体取决于数据库(类似于拍卖)
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)
holder.duration.setText(countdown)
holder.duration.setText(millisUntilFinished)
并且倒计时会在所需的持续时间和巨大的随机数之间闪烁,
请帮忙。
您应该使用一个TimerTask,并将所有UI更新放入该单个计时器中,而不是CountDownTimer为基本相同的任务运行多个s,因为您已经在做所有数学运算以确定任何特定项目的“时间到了”,您可能只运行一个TimerTask并每秒更新一次。CountDownTimer对于单个实现倒计时很有用,因为它会执行一些内置数学运算,等等。您正在重做所有数学运算,因此您最好使用一个regular实例TimerTask。
TimerTask
CountDownTimer
CountDownTimer在处理程序消息传递中按计划的延迟实现中继。单个倒计时实例不太可能导致任何奇怪的行为,但是如果您有多个实例,那么所有这些都应该在系统时钟每秒命中时“滴答”(以毫秒为单位的时间以“ 000”结尾-每秒一次,所有同时),那么这些处理程序都会尝试同时触发,并且不可避免地会失败。
如果UI或其他进程可能会延迟其中的某些消息,甚至达到“跳过刻度”以追赶的程度。同样,这意味着下一条消息的延迟可能仅距下一个刻度线的毫秒数(即,如果应该每隔1000毫秒检查一次,但又延迟了1990毫秒,则它将跳过一个刻度线,并将下一条消息安排为10迈尔斯进入未来。