Android countdowntimer tick no es preciso

Estoy utilizando un temporizador de cuenta regresiva para la notificación de audio … y no es exacto desde el principio …

utilizando parámetros iniciales

private final long startCountDown; private final long intervalCountDown; ... startCountDown = 180 * 1000; // 3 mns - to be set from Preferences later intervalCountDown = 60 * 1000; // 1 mns - to be set from Preferences later ... public void onTick(long millisUntilFinished) { Log.d(TAG, "notify countDown: " + millisUntilFinished + " msecs"); } countDownTimer = new SwimCountDownTimer(startCountDown,intervalCountDown); .... public void startCountDown() { Log.d(TAG, "start countDown for " + startCountDown + " msecs" ); countDownTimer.start(); } 

Puedo ver en el registro que la cuenta regresiva inicial se establece correctamente en 180000, pero el siguiente debe ser 120000 y se establece en 119945!

 04-27 14:50:42.146: I/SWIMMER(8670): notify countDown: 180000 msecs 04-27 14:51:42.206: I/SWIMMER(8670): notify countDown: 119945 msecs 

Esto es bastante molesto ya que el notificador de audio espera decir sólo '2 minutos "y no" 1 minuto y cincuenta y nueve segundos "…, por qué el intervalo no está bien …? Puedo tricj en el establecimiento de mí mismo el texto a la cadena de voz … pero ¿hay alguna manera de obtener datos correctos?

gracias por sugerencias

One Solution collect form web for “Android countdowntimer tick no es preciso”

Sé que es una vieja pregunta, pero también he encontrado el problema y pensé compartir mi solución.

Apperantly CountDownTimer no es muy preciso, así que he decidido implementar un contador de cuenta atrás más percise, utilizando java.util.Timer:

 public abstract class PreciseCountdown extends Timer { private long totalTime, interval, delay; private TimerTask task; private long startTime = -1; private boolean restart = false, wasCancelled = false, wasStarted = false; public PreciseCountdown(long totalTime, long interval) { this(totalTime, interval, 0); } public PreciseCountdown(long totalTime, long interval, long delay) { super("PreciseCountdown", true); this.delay = delay; this.interval = interval; this.totalTime = totalTime; this.task = getTask(totalTime); } public void start() { wasStarted = true; this.scheduleAtFixedRate(task, delay, interval); } public void restart() { if(!wasStarted) { start(); } else if(wasCancelled) { wasCancelled = false; this.task = getTask(totalTime); start(); } else{ this.restart = true; } } public void stop() { this.wasCancelled = true; this.task.cancel(); } // Call this when there's no further use for this timer public void dispose(){ cancel(); purge(); } private TimerTask getTask(final long totalTime) { return new TimerTask() { @Override public void run() { long timeLeft; if (startTime < 0 || restart) { startTime = scheduledExecutionTime(); timeLeft = totalTime; restart = false; } else { timeLeft = totalTime - (scheduledExecutionTime() - startTime); if (timeLeft <= 0) { this.cancel(); startTime = -1; onFinished(); return; } } onTick(timeLeft); } }; } public abstract void onTick(long timeLeft); public abstract void onFinished(); } 

Ejemplo de uso sería:

 this.countDown = new PreciseCountdown(totalTime, interval, delay) { @Override public void onTick(long timeLeft) { // update.. // note that this runs on a different thread, so to update any GUI components you need to use Activity.runOnUiThread() } @Override public void onFinished() { onTick(0); // when the timer finishes onTick isn't called // count down is finished } }; 

para iniciar la cuenta regresiva, simplemente llame a countDown.start (). countDown.stop () detiene el countDown, que podría ser reiniciado usando countDown.restart ().

Espero que esto sea una ayuda para cualquier persona en el futuro.

  • CameraToMpegTest.java no funciona, termina con IllegalStateException: No se puede detener debido a un estado incorrecto
  • Cómo cambiar el separador decimal de DecimalFormat de coma a punto / punto?
  • Cómo cambiar el tamaño del título del texto en la barra de acción?
  • Android RX - Observable.timer solo disparando una vez
  • En la estructura MVP, la clase responsable de mantener los elementos de la lista y la forma de notificar los cambios de datos en este
  • Cómo capturar el evento de volver a una actividad después de golpear de nuevo
  • ¿Cómo se pueden manipular las salidas de variantes con el complemento Android Gradle 3.0.0+?
  • Notificación de Android con RemoteViews: actividad asociada con el diseño de RemoteViews
  • Operador ternario devuelve valor - Java / Android
  • ¿Cómo encuentro los servidores DNS en Android desde un programa Java?
  • ¿Las Transiciones de Actividad / Fragmento son compatibles con dispositivos pre-Lollipop?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.