2010-03-08 4 views
2

J'essaie d'écrire une application Blackberry qui est essentiellement un chronomètre, et affiche les temps au tour. Premièrement, je ne suis pas sûr d'implémenter la fonctionnalité chronomètre de la manière la plus optimale. J'ai un LabelField (_myLabel) qui affiche l'horloge - commençant à 00:00. Ensuite, vous appuyez sur le bouton de démarrage et chaque seconde le champ _myLabel est mis à jour avec combien de secondes ont passé depuis la dernière mise à jour (il faut seulement incrémenter de 1, mais il y a parfois un retard et un saut). Je ne peux pas penser à une manière différente de le faire - et je suis nouveau pour le développement de l'interface graphique et les threads, donc je suppose que c'est pourquoi.Mise en œuvre du chronomètre Blackberry

EDIT: Voici ce que appelle le chronomètre:

_timer = new Timer(); 
_timer.schedule(new MyTimerTask(), 250, 250); 

Et voici le TimerTask:

class MyTimerTask extends TimerTask { 
long currentTime; 
long startTime = System.currentTimeMillis(); 

public void run() { 
synchronized (Application.getEventLock()) { 
currentTime = System.currentTimeMillis(); 
long diff = currentTime - startTime; 
long min = diff/60000; 
long sec = (diff % 60000)/1000; 
String minStr = new Long(min).toString(); 
String secStr = new Long(sec).toString(); 

if (min < 10) 
minStr = "0" + minStr; 
if (sec < 10) 
secStr = "0" + secStr; 

_myLabel.setText(minStr + ":" + secStr); 
timerDisplay.deleteAll(); 
timerDisplay.add(_timerLabel); 
} 
} 
} 

Quoi qu'il en soit lorsque vous arrêtez le chronomètre, il met à jour une table historique des données de temps au tour. Lorsque cette liste devient longue, le minuteur commence à se dégrader. Si vous essayez de faire défiler, cela devient vraiment mauvais.

Y a-t-il une meilleure façon de mettre en œuvre mon chronomètre?

+2

programmez-vous ce TimerTask tous les 1000 msecs? – Jack

+0

Désolé, vous avez oublié d'ajouter cette partie. Je vais mettre à jour avec l'info. – Michaela

Répondre

3

Voici quelques conseils:

  • garder la trace de la dernière valeur « sec » utilisé pour mettre à jour l'étiquette, et la sortie de la boucle d'exécution immédiatement si le « sec » nouvellement calculée valeur est la même - sinon vous rafraîchissez inutilement l'interface utilisateur avec les mêmes valeurs qui ralentissent tout
  • supprimez la synchronisation dans votre boucle d'exécution et mettez simplement le code qui modifie l'interface utilisateur (appel setText) dans un appel UiApplication.getUiApplication.invokeLater() (en utilisant un runnable anonyme)
  • ne pas supprimer le re-ajouter l'étiquette de l'écran ou maanger, vous juste n eed à appeler setText() et il devrait mettre à jour - si elle ne se met pas à jour alors appelez invalidate() sur le champ et il sera redessiné
  • maintenant que vous avez optimisé votre code et minimisé la quantité de dessin de l'interface utilisateur réelle, il est sûr de définir l'intervalle de TimerTask à une valeur inférieure, comme 50ms, de sorte que vous avez une mise à jour de la minuterie lisse

la chose la plus importante à retenir dans l'élaboration d'une interface utilisateur rapide est mise à jour que l'interface utilisateur lorsque vous avez besoin à, et seulement mettre à jour les champs qui ont besoin de changer. Si vous appelez des méthodes telles que deleteAll(), l'écran complet ou le gestionnaire sera actualisé, ce qui est vraiment très lent.

+0

Merci beaucoup !! Je l'ai modifié avec toutes vos suggestions et ça marche BEAUCOUP mieux !!! – Michaela