Comment mesurer le temps écoulé

J’ai un jeu de 10 et 20 questions. J’ai besoin de compter combien de temps est passé lorsqu’un utilisateur termine la partie.

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

Je l’utilise pour arrêter le compteur:

 T.cancel(); 

Maintenant j’ai besoin de deux choses:

  • Une façon de compter le temps écoulé et de le stocker dans une variable
  • J’ai besoin que la valeur finale soit un double, par exemple le score final est de: 15,49 secondes.

Quand le jeu commence:

 long tStart = System.currentTimeMillis(); 

Quand le jeu se termine:

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

Selon la documentation Android, SystemClock.elapsedRealtime() est la base recommandée pour la synchronisation des intervalles à usage général. Cela est dû au fait que, selon la documentation, elapsedRealtime () is guaranteed to be monotonic, [...], so is the recommend basis for general purpose interval timing.

La documentation de SystemClock offre une bonne vue d’ensemble des différentes méthodes temporelles et des cas d’utilisation qui leur sont applicables.

  • SystemClock.elapsedRealtime() et SystemClock.elapsedRealtimeNanos() constituent le meilleur moyen de calculer le temps écoulé.
  • SystemClock.uptimeMillis() et System.nanoTime() sont une autre possibilité, mais contrairement aux méthodes recommandées, elles n’incluent pas le temps en veille profonde. Si tel est votre comportement souhaité, il vous suffit de l’utiliser. Sinon, elapsedRealtime() avec elapsedRealtime() .
  • Restez à l’écart de System.currentTimeMillis() car cela renverra l’heure de l’horloge “wall”. Ce qui ne convient pas pour calculer le temps écoulé car le temps de l’horloge murale peut avancer ou reculer. De nombreux facteurs, tels que les clients NTP, peuvent provoquer un décalage temporel de l’horloge murale. Les calculs de temps écoulé basés sur currentTimeMillis() ne seront donc pas toujours exacts.

Lorsque le jeu commence:

 long startTime = SystemClock.elapsedRealtime(); 

Quand le jeu se termine:

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

De plus, Minuterie () est une timer au mieux et ne sera pas toujours précise. Il y aura donc une accumulation d’erreurs de synchronisation sur la durée du jeu. Pour afficher plus précisément l’heure intermédiaire, utilisez les vérifications périodiques de System.currentTimeMillis() comme base de l’heure envoyée à setText(...) .

De plus, au lieu d’utiliser Timer , vous pourriez vouloir utiliser TimerTask , cette classe est conçue pour ce que vous voulez faire. Le seul problème est qu’il compte à rebours au lieu de, mais cela peut être résolu avec une simple soustraction.

Encore mieux!

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

Lisez la documentation sur nanoTime ()!