Android CountDownTimer muestra 1 por dos segundos

Posible duplicado:
¿Por qué millisUntilFinished no puede detectar intervalos exactos CountDownTimer?

¿Por qué usar el CountDownTimer muestra "1" dos veces? Sólo quiero que la cuenta atrás sin problemas y no parece que se está colgando en el último segundo. ¿Alguien tiene alguna idea sobre cómo resolver este problema?

Aquí está el código de la página de desarrolladores de Android:

new CountdownTimer(30000, 1000) { public void onTick(long millisUntilFinished) { mTextField.setText("seconds remaining: " + millisUntilFinished / 1000); } public void onFinish() { mTextField.setText("done!"); } }.start(); 

He creado un nuevo proyecto y copiado y pegado este código en sólo para asegurarse de que no estaba accidentalmente estropear algo en mi programa. He estado probando esto en una pestaña 10.1. Lo hace cuando lo ejecuto: "5", "4", "3", "2", "1", "1", "hecho!".

El CountDownTimer no es preciso, volverá tan cerca de 1 segundo (en este caso) como puede, pero a menudo eso no será suficiente para darle lo que quiere.

Si registra el ms var verá que el resultado es algo como 29384 para el primer hit, y así sucesivamente, nunca será 30000, 29000 etc. No hay forma de obtener la precisión que necesita para que el contador funcione como Que se pretendía implementar actualmente.

Puede solucionar esto para la mayoría de los casos. Primero baje el intervalo para que obtenga más actualizaciones de lo que desea que aparezca, así que en lugar de 1 segundo haga 100ms y eso debería conseguir las ilusiones de un temporizador de cuenta atrás de 1 segundo ya que obtendrá al menos unas pocas actualizaciones por segundo (lo peor caso)

Para optimizar ese bit ronda el resultado en cada entrada y hacer un simple cheque para ver si debe hacer la actualización (secondsLeft ha cambiado) y si tiene actualizar la interfaz de usuario y el acumulador secondsLeft. También sugiero que onFinish producir el resultado final (0) sólo en caso de que el sistema falla porque algo está sucediendo que se come ciclos de CPU.

De todos modos aquí está el código modificado que funciona para este 99.99 veces fuera de un 100 si su sistema no está cargado pesadamente. NOTA: Usted probablemente puede escapar con 250ms, hasta que realmente.

  int secondsLeft = 0; new CountDownTimer(30000, 100) { public void onTick(long ms) { if (Math.round((float)ms / 1000.0f) != secondsLeft) { secondsLeft = Math.round((float)ms / 1000.0f); TV.setText("seconds remaining: " +secondsLeft ); } Log.i("test","ms="+ms+" till finished="+secondsLeft ); } public void onFinish() { TV.setText("0"); } }.start(); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.