Ошибка в частоте обратного вызова с CountDownTimer?

#java #android

#java #Android

Вопрос:

Я создавал небольшое приложение для темной комнаты с таймером, изучая Android и Java.
В итоге я использовал CountDownTimer, поскольку он выполняет большую часть работы за меня. :{)
Однако я столкнулся с тем, что выглядит как ошибка в классе.

Моя первоначальная структура использовала обратный вызов OnTick () для уменьшения моего счетчика времени и обновления отображения оставшегося времени. Если я настрою это, например:

             new CountDownTimer(60000, 100) {

                 public void onTick(long millisUntilFinished) {
                     mDisplayTime.setText(String.valueOf(millisUntilFinished)/1000);
                     timeTenths -= 1;
                     updateDisplay();
                 }

                 public void onFinish() {
//                   mDisplayTime.setText("Done!");
                 }
              }.start();
  

Общий тайм-аут (60 секунд) находится на месте, в пределах половины секунды по моему секундомеру.
Однако отображаемый счетчик останавливается на 3,0 секундах на часах.
Экспериментируя с этим, я обнаружил постоянную «нехватку» 5% в событиях OnTick ().
Я мог бы изменить второй параметр на 950 миллисекунд, но это ужасная ошибка…

В конце концов, я изменил OnTick (), чтобы отобразить фактический millisUntilFinished, что нормально, и также устраняет мой счетчик.

Это известная проблема с CountDownTimer ()?

Дэйв

Ответ №1:

Перед вызовом Google вы выполнили проверку с помощью LogCat? А именно, в вашем onTick методе вы можете захотеть отладить то, что millisUntilFinish приносит вам, а не полагаться только на TextView. Кроме того, если я что-то не понял неправильно, вам, возможно, придется рассмотреть onFinish() вашу окончательную «галочку».

Комментарии:

1. Демонстрируя мое невежество новичка, что такое LogCat? Хорошая мысль о том, что последний тик является onFinish() , но в моем примере он должен тикать 600 раз (я неправильно скопировал его как 60000/1000), и регулярно появляется 30 коротких.

2. Я действительно не стал бы полагаться onTick на то, что в этом случае меня вызовут ровно 600 раз. Что вам следует сделать, так это проверить, насколько точен его интервал. Как только вы получите, onTick сохраните millisUntilFinished и при следующем вызове вычтите новый миллисекундный результат из предыдущего, чтобы увидеть, насколько он «близок» к 100 мс. И LogCat значительно упрощает выполнение такого рода проверки.