android - programacion - System.currentTimeMillis() funciona incorrectamente
manual de programacion android pdf (2)
Necesito detener el reloj y utilicé http://www.goldb.org/stopwatchjava.html
No funcionó bien, así que traté de escribir el valor cada 1000 ms:
stopWatch.start();
HandlerScrollBar.postDelayed(TtScroll, 1000);
private Runnable TtScroll = new Runnable() {
public void run() {
long time = stopWatch.getElapsedTime();
HandlerScrollBar.postDelayed(TtScroll,(long) 1000);
Log.d(TAG, Long.toString(time));
}
};
Puedo ver el valor del tiempo cada segundo en CatLog y este es el resultado:
¡El tiempo real es máximo + 5ms pero en Columna es al menos +3 segundos! ¿Como es posible? Es lo mismo con
new Date().getTime().
¿Hay alguna clase de cronómetro que pasará esta prueba como se esperaba?
Gracias.
Parece imposible. Nunca tuve System.currentTimeMillis()
actuar de esa manera. Además, está Log.d()
sesión como Log.d()
pero el logcat que muestra indica un Log.e()
. ¿Seguro que es el logcat correcto?
Si está midiendo el tiempo transcurrido y desea que sea correcto, debe usar System.nanoTime()
. No puede usar System.currentTimeMillis()
, a menos que no le importe que su resultado sea incorrecto.
El propósito de nanoTime es medir el tiempo transcurrido, y el propósito de currentTimeMillis es medir el tiempo del reloj de pared. No puedes usar el uno para el otro propósito. La razón es que el reloj de ninguna computadora es perfecto; siempre se desplaza y de vez en cuando necesita ser corregido.
Como el propósito de nanoTime es medir el tiempo transcurrido, no se ve afectado por ninguna de estas pequeñas correcciones. Yo sugeriría elegir el nanoTime () ya que tiene una mayor precisión en esos microcalculados.
para mediciones extremadamente precisas del tiempo transcurrido. De su javadoc:
long startTime = System.nanoTime();
// ... el código que se mide ...
long estimatedTime = System.nanoTime() - startTime;