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
- Android añadiendo animaciones simples mientras setvisibility (view.Gone)
- ¿Por qué se genera un error al declarar una clase anidada de Fragmento estático como privada?
- Android - SQLiteException: near "=": error de sintaxis (código 1)
- Objeto comparable no de clasificación
- Cómo establecer la unidad para Paint.setTextSize ()
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
- Modos de envío y recepción de DES para la autenticación DESFire
- añadiendo algún efecto como eco a pista de audio utilizando AudioTrack de android
- RDP a través de Bluetooth
- Cómo evitar que la aplicación de Android se bloquee debido a la excepción en el hilo de fondo?
- Cómo deshabilitar el teclado virtual en WebView
- ¿Cómo saber si la cámara está en uso?
- ¿Qué significa COLLATE LOCALIZED ASC?
- Cómo obtener balizas visibles desde el método RegionBootstrap AltBeacon
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.
- ¿Cómo mover aplicaciones spcific a / de la tarjeta sd usando ADB?
- Obtenga la actividad actual en la prueba de instrumentación de Android