Question

Pour mon application Android il y a une minuterie qui mesure le temps écoulé. Jamais 100 millisecondes mettre à jour mon TextView avec un texte comme « Score: 10 Heure: 100.10 secondes. » Mais, je trouve le TextView met à jour que les premières fois. L'application est encore très réactif, mais l'étiquette ne sera pas mise à jour. J'ai essayé d'appeler .invalidate (), mais il ne fonctionne toujours pas. Je ne sais pas s'il y a un moyen de résoudre ce problème, ou un meilleur widget à utiliser.

Voici un exemple de mon code:

float seconds;
java.util.Timer gametimer;
void updatecount() { TextView t = (TextView)findViewById(R.id.topscore);
t.setText("Score: 10 - Time: "+seconds+" seconds");
t.postInvalidate();
}
public void onCreate(Bundle sis) {
... Load the UI, etc...
  gametimer.schedule(new TimerTask() { public void run() {
     seconds+=0.1; updatecount();
} }, 100, 100);
}
Était-ce utile?

La solution

La solution générale est d'utiliser au lieu android.os.Handler qui court dans le thread d'interface utilisateur. Il ne fait que callbacks one-shot, donc vous devez déclencher à nouveau chaque fois que votre rappel est appelée. Mais il est assez facile à utiliser. Un billet de blog sur ce sujet a été écrit il y a quelques années:

http://android-developers.blogspot.com/ 2007/11 / point-in-heure.html

Autres conseils

Ce que je pense qui se passe est vous tomber du thread d'interface utilisateur. Il y a un seul thread « looper » qui gère toutes les mises à jour de l'écran. Si vous essayez d'appeler « invalide () » et vous n'êtes pas sur ce rien de fil qui va se passer.

Essayez d'utiliser "postInvalidate ()" sur votre point de vue à la place. Il vous laisse mettre à jour une vue lorsque vous n'êtes pas dans le thread d'interface utilisateur actuelle.

Plus d'infos

Utilisez le code ci-dessous pour régler l'heure sur TextView

public class MyCountDownTimer extends CountDownTimer {
        public MyCountDownTimer(long startTime, long interval) {
            super(startTime, interval);
        }

        @Override
        public void onFinish() {

            ExamActivity.this.submitresult();
        }

        @Override
        public void onTick(long millisUntilFinished) {

            long millis = millisUntilFinished;

            int seconds = (int) (millis / 1000) % 60;
            int minutes = (int) ((millis / (1000 * 60)) % 60);
            int hours = (int) ((millis / (1000 * 60`enter code here` * 60)) % 24);

            String ms = String
                    .format("%02d:%02d:%02d", hours, minutes, seconds);
            txtimedisplay.setText(ms);
        }
    }

Il y a une autre façon de modifier le texte de chaque seconde; c'est ValueAnimator. Voici ma solution:

  long startTime = System.currentTimeMillis();
  ValueAnimator animator = new ValueAnimator();
            animator.setObjectValues(0, 1000);
            animator.setDuration(1000);
            animator.setRepeatCount(ValueAnimator.INFINITE);
            animator.addListener(new AnimatorListenerAdapter() {

                @Override
                public void onAnimationStart(Animator animation) {
                    long currentTime = System.currentTimeMillis();
                    String text = TimeFormatUtils.formatTime(startTime - currentTime);
                   yourTextView.setText(text);
                }

                @Override
                public void onAnimationRepeat(Animator animation) {
                    long currentTime = System.currentTimeMillis();
                    String text = TimeFormatUtils.formatTime(startTime - currentTime);
                    yourTextView.setText(text);
                }
            });
            animator.start();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top