Cómo medir el tiempo transcurrido

Tengo un juego de 10 y 20 preguntas. Necesito contar cuánto tiempo pasa cuando un usuario termina el juego.

Timer T=new Timer(); T.scheduleAtFixedRate(new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() { public void run() { countdown.setText(""+count); count++; } }); } }, 1000, 1000); 

Yo uso esto para detener el contador:

 T.cancel(); 

Ahora necesito dos cosas:

  • Una forma de contar el tiempo transcurrido y almacenarlo en una variable
  • Necesito que el valor final sea un doble, por ejemplo, el puntaje final es: 15.49 segundos.

Cuando el juego comienza:

 long tStart = System.currentTimeMillis(); 

Cuando el juego termina:

 long tEnd = System.currentTimeMillis(); long tDelta = tEnd - tStart; double elapsedSeconds = tDelta / 1000.0; 

Según los documentos de Android, SystemClock.elapsedRealtime() es la base recomendada para el intervalo de tiempo de propósito general. Esto se debe a que, según la documentación, elapsedRealtime () is guaranteed to be monotonic, [...], so is the recommend basis for general purpose interval timing.

La documentación de SystemClock tiene una buena descripción de los diversos métodos de tiempo y los casos de uso aplicables para ellos.

  • SystemClock.elapsedRealtime() y SystemClock.elapsedRealtimeNanos() son la mejor apuesta para calcular el tiempo transcurrido de propósito general.
  • SystemClock.uptimeMillis() y System.nanoTime() son otra posibilidad, pero a diferencia de los métodos recomendados, no incluyen el tiempo en el sueño profundo. Si este es su comportamiento deseado, entonces están bien de usar. De lo contrario, quédate con elapsedRealtime() .
  • Manténgase alejado de System.currentTimeMillis() ya que esto devolverá el tiempo de “pared” del reloj. Lo cual no es adecuado para calcular el tiempo transcurrido, ya que el reloj de pared puede saltar hacia adelante o hacia atrás. Muchas cosas, como los clientes NTP, pueden ocasionar que el tiempo del reloj de pared salte y sesgue. Esto causará que los cálculos de tiempo transcurrido basados ​​en currentTimeMillis() no siempre sean precisos.

Cuando el juego comienza:

 long startTime = SystemClock.elapsedRealtime(); 

Cuando el juego termina:

 long endTime = SystemClock.elapsedRealtime(); long elapsedMilliSeconds = endTime - startTime; double elapsedSeconds = elapsedMilliSeconds / 1000.0; 

Además, Timer () es un temporizador de mejor esfuerzo y no siempre será preciso. Entonces habrá una acumulación de errores de tiempo durante la duración del juego. Para mostrar con mayor precisión el tiempo intermedio, utilice comprobaciones periódicas a System.currentTimeMillis() como base del tiempo enviado a setText(...) .

Además, en lugar de utilizar Timer , es posible que desee examinar el uso de TimerTask , esta clase está diseñada para lo que desea hacer. El único problema es que cuenta hacia abajo en lugar de hacia arriba, pero eso se puede resolver con una simple resta.

¡Aun mejor!

 long tStart = System.nanoTime(); long tEnd = System.nanoTime(); long tRes = tEnd - tStart; // time in nanoseconds 

Lea la documentación sobre nanoTime ()!