tutorial ejemplo java android

java - ejemplo - Cómo medir el tiempo transcurrido



text box java (3)

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, la puntuación final es: 15.49 segundos.

¡Aun mejor!

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

Lea la documentation sobre nanoTime ()!


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 la documentation 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 documentation SystemClock tiene una buena descripción general 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á la hora del reloj del "muro". Lo cual no es adecuado para calcular el tiempo transcurrido ya que el tiempo del reloj de pared puede saltar hacia adelante o hacia atrás. Muchas cosas, como los clientes NTP, pueden hacer que el reloj de pared salte y se desvíe. Esto hará 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 interino, use verificaciones periódicas de System.currentTimeMillis() como la 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 atrás en lugar de subir, pero eso se puede resolver con una simple resta.