317 votes

Comment faire une pause / dormir fil ou processus dans Android?

Je veux faire une pause entre deux lignes de code, Laissez-moi vous expliquer un peu :

-> l'utilisateur clique sur un bouton (une carte, en fait), et je la montre en changeant l'arrière-plan de ce bouton :

thisbutton.setBackgroundResource(R.drawable.icon);

-> au bout de disons 1 seconde, j'ai besoin de revenir à la précédente, stade de la touche par l'évolution de son contexte :

thisbutton.setBackgroundResource(R.drawable.defaultcard);

-> J'ai essayé de mettre en pause le fil entre ces deux lignes de code :

try {Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

mais Il ne fonctionne pas. C'est peut-être le processus et non pas le Thread que j'ai besoin de faire une pause ??

Quelle est la meilleure solution à mettre en œuvre ?

De nombreux txs pour votre aide.

H.

J'ai essayé (mais il ne fonctionne pas ?)

new Reminder(5);

avec :

public class Reminder {

Timer timer;

        public Reminder(int seconds) {
            timer = new Timer();
            timer.schedule(new RemindTask(), seconds*1000);
        }

        class RemindTask extends TimerTask {
            public void run() {
                System.out.format("Time's up!%n");
                timer.cancel(); //Terminate the timer thread
            }
        }  
    }

477voto

tronman Points 2619

Vous pouvez simplifier votre code en supprimant le temporisateur et en utilisant la méthode postDelayed () du gestionnaire:

 @Override
public void onClick(View v) {
    my_button.setBackgroundResource(R.drawable.icon);
    // SLEEP 2 SECONDS HERE ...
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
         public void run() { 
              my_button.setBackgroundResource(R.drawable.defaultcard); 
         } 
    }, 2000); 
}
 

201voto

Gelldur Points 1473

Vous pouvez essayer celui-ci, c'est court

SystemClock.sleep(7000);

La Documentation

public static void sleep (long ms)

Ajout de l'API de niveau 1

Attend un nombre de millisecondes (de uptimeMillis) avant de revenir. Semblable à sleep(long), mais ne jetez pas InterruptedException; interrupt() les événements sont différés jusqu'à ce que le prochaine interruptible opération. Ne pas revenir jusqu'à ce qu'au moins le nombre de millisecondes spécifié s'est écoulé.

Paramètres

mme de sommeil avant de retourner, en millisecondes de temps de disponibilité.

31voto

Byt3 Points 101
J'utilise cela.

16voto

Daniel Yankowsky Points 3719

Vous ne voulez probablement pas à le faire de cette façon. En mettant explicitement sleep() dans le bouton-cliqué sur l'icône gestionnaire d'événements, vous auriez fait de verrouiller l'ensemble de l'INTERFACE utilisateur d'une seconde. Une alternative est d'utiliser une sorte de coup de Minuterie. Créer un TimerTask pour changer la couleur d'arrière-plan de retour à la couleur par défaut, et de l'annexe sur la Minuterie.

Une autre possibilité est d'utiliser un Gestionnaire. Il y a un tutoriel à propos de quelqu'un qui sont passés de l'aide d'une Minuterie à l'aide d'un Gestionnaire.

Par ailleurs, vous ne pouvez pas mettre en pause un processus. Un Java (ou Android) processus possède au moins 1 fil, et vous ne pouvez dormir threads.

9voto

Hubert Points 3461

C'est ce que j'ai fait à la fin de la journée - fonctionne bien maintenant:

 @Override
    public void onClick(View v) {
    	my_button.setBackgroundResource(R.drawable.icon);
    	// SLEEP 2 SECONDS HERE ...
    	final Handler handler = new Handler(); 
        Timer t = new Timer(); 
        t.schedule(new TimerTask() { 
                public void run() { 
                        handler.post(new Runnable() { 
                                public void run() { 
                                 my_button.setBackgroundResource(R.drawable.defaultcard); 
                                } 
                        }); 
                } 
        }, 2000); 
    }
 

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