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.

  • Log4j2 en Android
  • Cómo quitar las teclas repetibles, vista previa de clave del teclado personalizado de Android
  • Widget de conmutador vertical Android
  • ¿Algún problema o problema significativo con la Biblioteca de Databinding de Android?
  • Cómo detener la instalación de APK de múltiples sectores en Android Studio 2.3
  • Obtener json de HttpResponse
  • ¿Cuál es la estructura / patrón de android / java para organizar las llamadas de servicio web http en el proyecto?
  • Control de la intensidad de vibración en los teléfonos Android? ¿Es posible?
  • Android - ¿Cómo puedo "iniciar" o "inicializar" un Fragmento de una actividad?
  • Android / Java - ¿Cómo crear una conexión HTTPS?
  • import javax.xml.transform no se puede resolver
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.