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

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.

  • Alternativa a la biblioteca de lectores QR de zxing para Java / Android?
  • Quitar fragmento de bloqueo
  • Android and javafx ligero marco de eventos compatible
  • Control de un motor con un dispositivo Android
  • Un ligero retraso al hacer clic en un botón
  • Android, Almacenamiento y recuperación de texto
  • ¿Cuál es el valor de R.id.ImageButton?
  • Historial de uso de dispositivos móviles de Android NetworkStatsManager
  • ¿Debo hacer java objetos nulos?
  • Android FileNotFound Exception - No se puede getInputStream desde la URL de la imagen que no tiene formato de archivo
  • onNavigationItemSelected no se llama
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.