2011-07-24 15 views
15

Duplicar posibles:
How come millisUntilFinished cannot detect exact CountDownTimer intervals?Android countDownTimer muestra 1 durante dos segundos

¿Por qué usar el CountDownTimer espectáculo "1" dos veces? Solo quiero que la cuenta regresiva sea fluida y no parezca que se cuelga en el último segundo. ¿Alguien tiene alguna idea sobre cómo resolver este problema?

Aquí es 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 copiar y pegar este código en sólo para asegurarse de que yo no estaba jugando accidentalmente algo en mi programa. He estado probando esto en una Pestaña 10.1. Hace esto cuando lo ejecuto: "5", "4", "3", "2", "1", "1", "¡hecho!".

+0

Muéstranos el código. –

+0

Debe desconectar el valor de 'millisUntilFinished' en el método' onTick (long) '. Esto es lo que se está utilizando para actualizar su 'TextView'. –

+1

verifique esto - https://stackoverflow.com/a/47695735/6244429 –

Respuesta

47

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

Si registra el ms var, verá que el resultado es algo así como 29384 para el primer golpe, y así sucesivamente, nunca será 30000, 29000, etc. No hay forma de obtener la precisión que necesita para hacer el contador funciona como pretendía que esté implementado actualmente.

Puede solucionarlo en la mayoría de los casos. Primero baje su intervalo para que obtenga más actualizaciones de las que desea generar, de modo que en lugar de 1 segundo haga 100ms y eso le hará ilusiones de un temporizador de cuenta atrás de 1 segundo, ya que obtendrá al menos algunas actualizaciones por segundo (peor case)

Para optimizar ese bit, redondee el resultado de cada entrada y realice una simple comprobación para ver si debe hacer la actualización (segundosLeft ha cambiado) y si ha actualizado la UI y el acumulador SecondLeft. También sugiero que onFinish produzca el resultado final (0) solo en caso de que el sistema falle debido a que algo está sucediendo y come ciclos de CPU.

De todos modos aquí está el código modificado que funciona para esto 99.99 veces de un 100 si su sistema no está cargado en exceso. NOTA: Probablemente pueda salirse con 250ms, depende de usted.

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(); 
+2

Gran respuesta, pero creo que la API debería hacer una indicación de que la clase es imprecisa. –

+0

Casi tres años después, ¡y el Temporizador de cuenta regresiva todavía muestra ese último tic dos veces! Pero esta solución funcionó para mí, ¡gracias! +1 – yiwei

+0

Después de probar tantas soluciones finalmente, esta solución funcionó para mí. gracias +1 – silwar

Cuestiones relacionadas