Cómo medir el tiempo transcurrido

Tengo un juego de preguntas 10 y 20. Tengo que contar cuánto tiempo se 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 el valor final para ser un doble, por ejemplo la puntuación 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; 

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

La documentación de SystemClock tiene una buena visió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 SystemClock.elapsedRealtimeNanos() para calcular el tiempo de uso general transcurrido.
  • 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 para usar. De lo contrario seguir con elapsedRealtime() .
  • Manténgase alejado de System.currentTimeMillis() ya que esto devolverá el tiempo de reloj "wall". Lo cual no es adecuado para calcular el tiempo transcurrido, ya que el reloj de pared puede saltar hacia delante o hacia atrás. 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. Así que habrá una acumulación de errores de tiempo durante la duración del juego. Para mostrar con mayor precisión el tiempo provisional, utilice chequeos periódicos a System.currentTimeMillis() como base del tiempo enviado a setText(...) .

Además, en lugar de usar 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 vez de hacia arriba, pero que puede resolverse 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 ()!

  • Diseño personalizado para DialogFragment OnCreateView vs. OnCreateDialog
  • Android: activity_main no se puede resolver o no es un campo
  • Cómo cambiar dinámicamente el tamaño del texto en Android
  • Error en la conversión de fechas en java
  • Android: ¿Es posible dibujar una vista en la parte superior del mapa como una superposición
  • Hoy es día n del año
  • No se pudo encontrar el método en el contexto padre o antepasado
  • La ejecución falló para la tarea ': app: dexDebug' Android Studio
  • ¿Qué tamaño debe tener el icono en un alerta?
  • Actualización de Eclipse con herramientas de desarrollo de Android v. 23
  • ¿Cómo pasar el parámetro a un webservice usando ksoap2?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.