2010-12-19 3 views
1

Mon application Android fonctionne correctement, sauf la séquence de fin. Son jeu et à la fin l'écran affiche le score:Ralentissement de l'interface utilisateur graphique sous Android

TextView allscores = new TextView(this); 

allscores.setText("Your score: "+ mypoints); 

Ensuite, je veux l'interface graphique de ralentissement pendant quelques secondes afin que l'utilisateur a le temps de prendre les informations. Peut-être que 2 ou 3 secondes vont bien.

try { 
       Thread.sleep(3000); 

      } catch (InterruptedException e) { 

       e.printStackTrace(); 
      } 

          layout.removeAllViews(); 

Gardez à l'esprit que je suis novice dans la programmation de threads. Tout cela est fait sur le thread UI, je n'ai pas d'autres threads en cours d'exécution. Ensuite, je mets dans un écran de démarrage finale fin:

AnView animator = new AnView(this); 

      layout.addView(animator); 

où AnView est ma propre extension de vue.

Dans l'ensemble, il fonctionne très bien. Le problème est que le thread dort pendant 3 secondes sans montrer mon score final. Je ne sais pas pourquoi. Je ne sais pas pourquoi ça ne montre pas mon score final avant de dormir. Il devient vide, indiquant qu'il a supprimé toutes les vues et a ensuite dormi.

+0

Peut-être des réponses à cette question, vous aide: http: // stackoverflow. com/questions/4203579/sleep-command-for-android – Curd

Répondre

3

Vous ne voyez pas le score car le fait de dormir sur le thread UI empêche les opérations de mise en page et de dessin qui rendent vos modifications de texte visibles. Ne dormez jamais sur le fil de l'interface utilisateur.

L'utilisation d'un nouveau thread est surdimensionné. Utilisez un gestionnaire et la méthode postDelayed pour que quelque chose se produise après un délai.

private final Handler mHandler = new Handler(); 

Puis, quand vous voulez faire quelque chose plus tard,

mHandler.postDelayed(new Runnable() { 
    public void run() { 
     doDelayedThing(); 
    } 
}, 3000); 
1

Il est déconseillé de dormir le filetage principal de l'interface utilisateur. Essayez quelque chose comme ceci:

nouveau Thread (new Runnable() { // fonctionne ici }); Ou vous pouvez essayer d'utiliser un pop-up Toast pour la partition.

+0

Vraiment? On m'a conseillé de faire la plupart du travail dans la programmation GUI dans le fil de l'interface utilisateur. Y a-t-il une raison de ne pas dormir? –

+1

Lire quelques lignes vers le bas quand il parle du "modèle de thread unique" http://developer.android.com/resources/articles/painless-threading.html Je soupçonne que vous dormez le fil de l'interface utilisateur et il ne peut même pas afficher la vue. – Realn0whereman

+0

Pourquoi ne pas simplement utiliser un écouteur pour écouter une clé de l'utilisateur, puis passer à l'écran de démarrage?De cette façon, vous parvenez à donner à l'utilisateur tout le temps dont il a besoin pour regarder les scores, et aussi utiliser le même fil tout en le gardant toujours réactif, puisque vous utilisez juste un écouteur pour le travail. –

1

Vous pouvez également utiliser Timer pour attendre 3 secondes, ce qui lancera un nouveau thread après la fin du temps imparti.

Timer timer = new Timer(); 
timer.schedule(new TimerTask() { 
    @Override 
    public void run() { 
       AnView animator = new AnView(this); 
       layout.addView(animator); 
    } 
}, 3000);