Android CountDownTimer показывает 1 в течение двух секунд

Возможный дубликат:
Почему MMISUntilFinished не может определить точные интервалы CountDownTimer?

Почему использование CountDownTimer показывает «1» дважды? Я просто хочу, чтобы он обратный отсчет плавно и не выглядел так, будто он завис на последней секунде. У кого-нибудь есть идеи о том, как решить эту проблему?

Вот код со страницы разработчиков Android:

new CountdownTimer(30000, 1000) { public void onTick(long millisUntilFinished) { mTextField.setText("seconds remaining: " + millisUntilFinished / 1000); } public void onFinish() { mTextField.setText("done!"); } }.start(); 

Я создал новый проект, скопировал и вставил этот код только для того, чтобы убедиться, что я случайно не ввел что-то в свою программу. Я тестировал это на вкладке 10.1. Он делает это, когда я запускаю его: «5», «4», «3», «2», «1», «1», «done!».

Solutions Collecting From Web of "Android CountDownTimer показывает 1 в течение двух секунд"

CountDownTimer не является точным, он будет возвращаться как можно ближе к 1 секунде (в данном случае), как это часто бывает, но часто этого недостаточно, чтобы дать вам то, что вы хотите.

Если вы зарегистрируете ms var, вы увидите, что результат – это что-то вроде 29384 для первого удара и т. Д., Он никогда не будет 30000, 29000 и т. Д. Невозможно получить точность, необходимую для работы счетчика Вы планировали в настоящее время.

Вы можете исправить это для большинства случаев. Сначала уменьшите интервал, чтобы получить больше обновлений, чем то, что вы хотите вывести, поэтому вместо 1 секунды сделайте 100 мс, и это должно вызвать иллюзии таймера обратного отсчета в 1 секунду, так как вы получите хотя бы несколько обновлений в секунду (худшее дело)

Чтобы оптимизировать этот бит вокруг результата для каждой записи и выполнить простую проверку, чтобы проверить, нужно ли делать обновление (изменилось значение секундLeft), и если он обновил пользовательский интерфейс и аккумулятор secondLeft. Также я предлагаю, чтобы onFinish дал окончательный результат (0) на всякий случай, когда система глючит, потому что происходит что-то, что ест циклы процессора.

В любом случае, это модифицированный код, который работает в течение 99,99 раза из 100, если ваша система не загружена сильно. ПРИМЕЧАНИЕ. Возможно, вам удастся сэкономить 250 мс, до вас.

  int secondsLeft = 0; new CountDownTimer(30000, 100) { public void onTick(long ms) { if (Math.round((float)ms / 1000.0f) != secondsLeft) { secondsLeft = Math.round((float)ms / 1000.0f); TV.setText("seconds remaining: " +secondsLeft ); } Log.i("test","ms="+ms+" till finished="+secondsLeft ); } public void onFinish() { TV.setText("0"); } }.start();