2010-11-24 7 views
2
view.setText("hello"); 
wait(1000); 
view.setText("world"); 

Lorsque j'appelle la fonction ci-dessus, la vue n'affiche pas du tout "bonjour". Le texte ne se met à jour que lorsque la fonction complète est terminée. Que dois-je appeler pour voir "bonjour"?Mises à jour TextView in Android

+0

pouvez-vous partager plus de code? – st0le

Répondre

5

Le problème est que vous mettez à jour l'interface utilisateur bloquant le thread d'interface utilisateur, puis la mise à jour à nouveau. Vous ne devriez pas dormir le fil de l'interface utilisateur, c'est une mauvaise pratique et les utilisateurs ne l'aimeront pas. Thread résoudrait le problème, mais vous n'avez vraiment pas besoin d'un thread pour ce que vous faites ici (aussi, vous ne devriez pas mettre à jour l'interface utilisateur à partir d'un thread d'arrière-plan, vous auriez besoin d'utiliser un gestionnaire pour envoyer un message).

Vous devez utiliser un gestionnaire à lui 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 le rappeler à 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 temporisée de l'interface utilisateur 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");  
    } 
}; 
0

Je pense que je connais votre problème.

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

boucle principale:

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

ce qui se passe ici est MODIFY pour bonjour wait au monde modifier rafraîchissement.

vous faire la principale attente de fil, mais l'interface rafraichit jamais entre le temps

pour résoudre ce que vous avez plusieurs façons:

-thread les modifications afin que votre attente ne porte pas atteinte à l'affichage quelque chose comme

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

Vous avez le bon problème ... il bloque le fil de l'interface utilisateur avec l'appel à attendre, mais votre solution n'est pas tout à fait raison. Vous ne devez pas mettre à jour l'interface utilisateur à partir du thread d'arrière-plan. Vous devez utiliser un gestionnaire et envoyer un message au thread d'interface utilisateur pour mettre à jour l'affichage. –

1

Je trouve ce code sur le centre de développeur et fonctionne très 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();