web-dev-qa-db-fra.com

Comment avez-vous la pause de code pendant quelques secondes dans Android?

Fondamentalement, j'ai besoin d'une pause (basée sur seulement quelques secondes) pour être mise dans une action afin que l'utilisateur puisse voir ce qui se passe avant que la prochaine action ne soit prise. Donc pour le blackjack, quand c'est le tour du croupier et qu'il décide de frapper, il frappe, une carte est ajoutée, puis il décide quoi faire ensuite. Donc, avant qu'il ne décide quoi faire ensuite, je veux que le code se mette en pause afin qu'il puisse être "vu" quant à ce que fait le croupier de cette façon, le croupier ne termine pas ses actions en moins d'une seconde et le joueur ne voit que Les resultats.

Merci d'avance!

Je dois noter que j'ai essayé d'utiliser wait (insérer le numéro ici); mais Eclipse me dit qu'il provoque une erreur d'interception de pile ou quelque chose du genre et lève une exception, ne faisant donc rien: (

Eh bien, c'est intéressant, (la façon dont j'ai programmé les choses est pour le moins "intéressant") J'ai fait le Thread.sleep (5000) et l'ai jeté sous une prise d'essai, il dort pendant 5 secondes puis continue de le faire le code. Cependant, mes mises à jour des vues ne s'affichent qu'après avoir appuyé sur un bouton (déteste vraiment la programmation basée sur les événements).

38
Ivan S

Apprendre à penser en termes d'événements est en effet la clé ici. Tu peux le faire. :)

La première règle est: ne jamais bloquer le thread d'interface utilisateur. Le thread d'interface utilisateur est responsable de la réactivité de votre application. Tout travail que vous y faites ne doit pas bloquer; faites ce que vous devez faire et revenez le plus rapidement possible. Évitez absolument de faire des E/S sur le thread d'interface utilisateur. (Il y a certains endroits où vous ne pouvez pas vraiment l'aider en raison des exigences du cycle de vie, par exemple, enregistrer l'état de l'application dans onPause.) Si vous jamais appel Thread.sleep sur le thread de l'interface utilisateur, vous vous trompez.

Android applique cela avec l'erreur "Application ne répond pas" (ou "ANR") que l'utilisateur voit. Chaque fois que vous voyez cela dans une application Android Android, cela signifie que le développeur a fait quelque chose qui a causé le blocage du thread d'interface utilisateur pendant trop longtemps. Si l'appareil est vraiment enlisé pour une raison quelconque, cette erreur pourrait ne pas être réellement la faute du développeur de l'application, mais cela signifie généralement que l'application fait quelque chose de mal.

Vous pouvez utiliser ce modèle à votre avantage en publiant vos propres événements. Cela vous permet de dire facilement à votre application "faites-le plus tard". Dans Android la clé pour publier vos propres événements se trouve dans la classe Handler . La méthode postDelayed = permet de programmer un Runnable qui sera exécuté après un certain nombre de millisecondes.

Si vous avez une activité qui ressemble à ceci:

public class MyActivity extends Activity {
    private Handler mHandler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mHandler.postDelayed(new Runnable() {
            public void run() {
                doStuff();
            }
        }, 5000);
    }

    private void doStuff() {
        Toast.makeText(this, "Delayed Toast!", Toast.LENGTH_SHORT).show();
    }
}

Ensuite, 5 secondes après la création de l'activité, vous verrez le toast créé dans doStuff.

Si vous écrivez un View personnalisé, c'est encore plus facile. Les vues ont leur propre méthode postDelayed qui mettra tout en ligne dans la bonne Handler et vous n'avez pas besoin de créer la vôtre.

La deuxième règle est la suivante: les vues doivent uniquement être modifiées sur le thread d'interface utilisateur. Ces exceptions que vous obtenez et ignorez signifient que quelque chose s'est mal passé et si vous les ignorez, votre application commencera probablement à se comporter de manière intéressante. Si votre application effectue l'essentiel de son travail dans d'autres threads, vous pouvez post événements directement sur la vue que vous souhaitez modifier afin que les modifications s'exécutent correctement.

Si vous avez une référence à votre Activity à partir de cette partie de votre code, vous pouvez également utiliser Activity#runOnUIThread , qui fait exactement ce que son nom implique. Vous préférerez peut-être cette approche si la publication dans une seule vue n'a pas vraiment de sens dans le contexte.

En ce qui concerne les mises à jour des vues qui n'apparaissent que lorsque vous appuyez sur un bouton, de quel type de vues s'agit-il? S'agit-il de vues personnalisées qui dessinent ces mises à jour? Si tel est le cas, vous souvenez-vous d'appeler invalidate après la modification des données pour déclencher le redessin? Les vues ne se redessinent qu'après avoir été invalidées.

96
adamp