web-dev-qa-db-fra.com

Comment faire un programme Android 'attendre'

Je veux que mon programme s'interrompe pendant un certain nombre de millisecondes. Comment ferais-je exactement cela?

J'ai trouvé différents moyens tels que Thread.sleep( time ), mais je ne pense pas que ce soit ce dont j'ai besoin. Je veux juste que mon code fasse une pause sur une certaine ligne pendant x millisecondes. Toutes les idées seraient grandement appréciées.

C'est le code original en C ...

extern void delay(UInt32 wait){
    UInt32 ticks;
    UInt32  pause;

    ticks = TimGetTicks();
    //use = ticks + (wait/4);
    pause = ticks + (wait);
    while(ticks < pause)
        ticks = TimGetTicks();
}

attendre est une quantité de millisecondes

10
JuiCe

OK, tout d’abord, ne mettez jamais un délai avec une boucle occupée comme vous le faites. Je peux voir d’où cela vient. Je suppose que le pilote Palm était un périphérique à processus unique ne comportant pas de fonction sleep () intégrée, mais sur un périphérique à processus multiples, une boucle occupée comme celle-ci processeur à ses genoux. Cela tue votre batterie, empêche le bon fonctionnement des tâches normales du système, ralentit ou arrête complètement les autres programmes, empêche le périphérique de répondre et peut même provoquer des brûlures aux mains.

L'appel que vous recherchez est Thread.sleep (). Vous devrez configurer le système pour détecter toutes les exceptions d'interruption qui se produisent pendant votre sommeil.

Deuxièmement, avec les interfaces utilisateur basées sur des événements tels qu'Android (ou pratiquement tout système à interface graphique moderne), vous ne voulez jamais dormir dans le fil de l'interface utilisateur. Cela gèlera également tout le périphérique et entraînera un crash de l'ANR (activité non réactive), comme d'autres afficheurs l'ont mentionné. Plus important encore, ces petits blocages gâchent totalement l'expérience utilisateur.

(Exception: si vous dormez assez longtemps sans que l'utilisateur dorme, vous pouvez vous en sortir. 1/4 de seconde est probablement correct, bien que l'application puisse être désordonnée en fonction de la situation.)

Malheureusement, il n'y a pas de moyen propre et élégant de faire ce que vous voulez si vous portez une application basée sur des boucles sur un système basé sur des événements.

Cela dit, la procédure appropriée consiste à créer un gestionnaire dans votre thread d'interface utilisateur et à lui envoyer des messages différés. Les messages différés "réveilleront" votre application et la pousseront à exécuter tout ce qu’elle allait faire après le délai.

Quelque chose comme ça:

View gameBoard;     // the view containing the main part of the game
int gameState = 0;  // starting
Handler myHandler;

public void onCreate(Bundle oldState) {
  super.onCreate(oldState);
  ...
  gameBoard = findViewById(R.layout.gameboard);
  myHandler = new Handler();
  ...
}

public void onResume() {
  super.onResume();
  displayStartingScreen();
  myHandler.postDelayed(new Runnable() { 
    gotoState1(); 
  }, 250);
}

private void gotoState1() {
  // It's now 1/4 second since onResume() was called
  displayNextScreen();
  myHandler.postDelayed(new Runnable() { 
    gotoState2();
  }, 250);
}
...
9
Edward Falk

Vous ne devriez vraiment pas endormir le thread d'interface utilisateur de cette manière, vous risqueriez de forcer votre application à se fermer avec l'exception ActivityNotResponding si vous le faites.

Si vous voulez retarder l'exécution d'un code pendant un certain temps, utilisez un Runnable et un Handler comme ceci:

Runnable r = new Runnable() {
    @Override
    public void run(){
        doSomething(); //<-- put your code in here.
    }
};

Handler h = new Handler();
h.postDelayed(r, 1000); // <-- the "1000" is the delay time in miliseconds. 

De cette façon, votre code est toujours retardé, mais vous ne "gelez" pas le thread d'interface utilisateur, ce qui entraînerait au mieux des performances médiocres et, au pire, la fermeture forcée d'ANR.

17
FoamyGuy

Faites quelque chose comme ce qui suit. Voici un lien vers la référence , cela pourrait être utile.

final MyActivity myActivity = this;   

    thread=  new Thread(){
        @Override
        public void run(){
            try {
                synchronized(this){
                    wait(3000);
                }
            }
            catch(InterruptedException ex){                    
            }

            // TODO              
        }
    };

    thread.start();   
3
prolink007

Vous ne savez pas pourquoi vous voulez que le programme fasse une pause. Si vous souhaitez effectuer une tâche en arrière-plan et utiliser les résultats, consultez AsyncTask . J'ai eu une question similaire quelque temps en arrière.

1
Primal Pappachan

Vous pouvez utiliser la classe Handler et la méthode postDelayed() pour le faire:

Handler h =new Handler() ;

h.postDelayed(new Runnable() {

  public void run() {

    //put your code here

  }, 2000);

2000 ms est le délai d'attente avant d'exécuter le code dans la fonction

1
Mohamad Abdallah

SystemClock.sleep (millis) est une fonction utilitaire très similaire à Thread.sleep (millis), mais elle ignore InterruptedException.

1
Ken

Je pense que Thread.sleep (....) est probablement ce que vous voulez, vous ne le faites peut-être pas correctement. Qu'est-ce que vous essayez de faire une pause? Espérons que ce n'est pas le fil de l'interface utilisateur? Je suppose que vous avez un fil d’arrière-plan effectuant certaines tâches à intervalles réguliers? Si tel est le cas, Thread.sleep mettra ce thread en veille pendant un certain temps, mais ne mettra pas tous les threads en pause.

0
Jon Taylor
try {
    Thread.sleep(2000); //1000 milliseconds is one second.
}
catch (InterruptedException e) 
{
    e.printStackTrace();
}
0
rmoore