2016-04-27 2 views
2

J'essaie de créer une application Android qui enregistre la position d'un coureur chaque seconde. Cependant, je trouve qu'il prend un peu plus d'une seconde quand il se termine.Boucle pour exactement une seconde

Voici mon code:

Runnable run = new Runnable() { 
    @Override 
    public void run() { 
     Long start = SystemClock.elapsedRealtime(); 
     if (getIfRunning() == true) { 
      try { 
       if (location2 != null) { 
        Float distanceFromLast = totalDistance(location2); 
        addToDistance(distanceFromLast); 
       } 
       getCoords(); 
       mMap.clear(); 
       markOldCoords(); 
       writeCoords(); 
       setCount(); 
       updateScreen(); 
      } catch (Exception e) { 
      } 
     } 
     Long time = SystemClock.elapsedRealtime() - start; 
     handler.postDelayed(this, 1000 - time); 
    } 
}; 
handler.post(run); 
+0

[Javadoc] (http://developer.android.com/reference/android/os/Handler.html#postDelayed%28java.lang.Runnable,%20long%29): * Provoque l'ajout du runnable r la file d'attente des messages, à exécuter ** après ** la durée spécifiée écoulée. * Donc oui, il ne s'exécutera pas * exactement * à l'heure spécifiée, juste après. – Andreas

+0

Une chose que vous pouvez faire ... créer votre propre 'HandlerThread' et baser votre' Handler' hors de cela. Pourquoi? Si vous utilisez le constructeur par défaut pour 'Handler', il est plus probable (en fonction de l'endroit où vous le construisez) d'utiliser le thread d'interface utilisateur. Eh bien, beaucoup d'autres choses utilisent aussi ce thread, donc 'Runnable' devra se contenter d'autres utilisations de ce thread. –

+0

Bien mal essayer! Merci pour votre aide –

Répondre

5

D'une manière générale, vous ne pouvez pas obtenir exactement le moment comme celui-ci. Les temporisateurs se réveilleront toujours un peu tôt ou tard en raison de ce que fait le système à ce moment-là. Le mieux que vous puissiez faire est d'accepter qu'il ne sera jamais parfait et de mettre à jour votre code en conséquence pour connaître les moments où vous avez été réellement déclenché.

+0

des suggestions pour une meilleure méthode, il sera près de 15 secondes après 5 minutes ce qui n'est pas assez précis pour la plupart des utilisateurs. –

+0

@NathanMay Souvenez-vous du * premier * horodatage, puis calculez le temps d'attente à partir de celui-ci, afin d'éviter l'asymétrie cumulative, ce que vous expérimentez actuellement. – Andreas

+0

@Andreas n'est-ce pas ce que j'ai déjà fait? Je trouve le temps avant que les méthodes soient appelées, après qu'elles soient appelées et trouvent la différence. Désolé, nouveau à ce –