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.

  • Envío de HTML en el cuerpo de un mensaje de correo electrónico
  • Android: java.lang.IllegalStateException: Ya conectado
  • Cómo hacer una pantalla de bien codificada de bienvenida
  • "Error de parámetro de línea de comandos no válido" al intentar hacer un ejemplo de mundo hola para Android
  • No se puede encontrar org.gradle.api.artifacts.result.ResolvedModuleVersionResult cuando se aplica el complemento de Android en Gradle
  • java.lang.ClassCastException: android.widget.TextView. ¿Por qué estoy recibiendo esto?
  • Gradle build failed: Los archivos Dex no pueden superar los 64k
  • Cómo parar toast & alertDialog perder el foco en mi filtro EditText
  • Android (Java) HttpURLConnection reintento silencioso en 'lectura' timeout
  • Android: liberación de la memoria asignada AnimationDrawable está utilizando hasta
  • Desactivar partes del código para acelerar los tiempos de construcción (Gradle)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.