2 votes

Mise à jour du TextView dans Android

view.setText("hello");
wait(1000);
view.setText("world");

Lorsque j'appelle la fonction ci-dessus, la vue n'affiche pas du tout "hello". Le texte n'est mis à jour que lorsque la fonction complète est terminée. Que dois-je appeler pour voir "hello" ?

5voto

Brian ONeil Points 3012

Le problème est que vous mettez à jour l'interface utilisateur en bloquant le thread de l'interface utilisateur, puis en le remettant à jour. Vous ne devriez pas mettre en sommeil le thread de l'interface utilisateur, c'est une mauvaise pratique et les utilisateurs ne l'apprécieront pas.

Le threading résoudrait le problème, mais vous n'avez vraiment pas besoin d'un thread pour ce que vous faites ici (de plus, vous ne devriez pas mettre à jour l'interface utilisateur à partir d'un thread d'arrière-plan, vous devriez utiliser un gestionnaire pour envoyer un message).

Vous devriez utiliser un gestionnaire seul pour effectuer ce type de mise à jour simple, car il n'utilise pas de thread supplémentaire dans l'application. Vous pouvez utiliser la méthode postDelayed pour qu'il rappelle votre thread d'interface utilisateur à un moment précis.

Cet article http://developer.Android.com/resources/articles/timed-ui-updates.html couvre la mise en œuvre d'une mise à jour de l'interface utilisateur dans le temps et est assez simple.

Pour convertir votre exemple :

//member variable
private Handler mHandler = new Handler();

//In your current Method
view.setText("hello"); 
mHandler.postDelayed(mUpdateTimeTask, 1000);

//Member variable
private Runnable mUpdateTimeTask = new Runnable() {
   public void run() {
      view.setText("world");      
   }
};

1voto

J'ai trouvé ce code sur le centre de développement et il fonctionne bien :

view.setText("hello");
new CountDownTimer(1000, 100) {
    TextView view = (TextView) findViewById(R.id.view);

    public void onTick(long millisUntilFinished) { }

    public void onFinish() {         
        view.setText("World!")
    }
}.start();

0voto

Jason Rogers Points 8924

Je pense que je sais quel est votre problème.

Lorsque vous modifiez un objet de l'interface utilisateur, il change son état mais pas directement l'écran. Chaque système fonctionne légèrement différemment mais la logique de base est la même.

Boucle principale :

1)modifications des éléments 2)rafraîchissement de l'écran.

ce qui se passe ici est modifier en hello attendre modifier en world rafraîchir.

vous faites attendre le thread principal mais l'interface ne se rafraîchit jamais entre temps

Pour résoudre ce problème, vous avez plusieurs possibilités :

-Effectuez les modifications de manière à ce que votre attente n'affecte pas l'affichage. quelque chose comme

new Thread(new Runnable(){
    public void run(){
        wait(1000);
        view.setText();
    }
}
  • invalider la vue. C'est le moyen de signaler à l'affichage que quelque chose a changé et qu'il doit être redessiné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X