242 votes

Répéter une tâche avec un temps de retard ?

J'ai une variable dans mon code dire que c'est "l'état".

Je veux afficher un texte dans l'application en fonction de cette valeur de la variable. Cela doit être fait avec un temps de retard.

C'est comme,

  • Vérification de l'état de la valeur de la variable

  • Affichage du texte

  • Attendez 10 secondes

  • Vérification de l'état de la valeur de la variable

  • Affichage du texte

  • Attendez 15 secondes

et ainsi de suite. Le temps de retard peut varier et il est défini une fois que le texte est affiché.

J'ai essayé Thread.sleep(time delay) et il a échoué. Une meilleure façon d'obtenir ce fait?

484voto

inazaruk Points 37760

Vous devez utiliser de fonction à cet effet. Il s’exécute votre code avec délai spécifié sur le thread d’interface utilisateur principal, ainsi vous serez en mesure de mettre à jour les contrôles d’interface utilisateur.

41voto

ravemir Points 317

Pour toute personne intéressée, voici une classe que j'ai créé à l'aide de inazaruk du code qui crée tout ce qui est nécessaire (je l'ai appelé UIUpdater car je l'utilise régulièrement mise à jour de l'INTERFACE utilisateur, mais vous pouvez l'appeler ce que vous voulez):

import android.os.Handler;
/**
 * A class used to perform periodical updates,
 * specified inside a runnable object. An update interval
 * may be specified (otherwise, the class will perform the 
 * update every 2 seconds).
 * 
 * @author Carlos Simões
 */
public class UIUpdater {
        // Create a Handler that uses the Main Looper to run in
        private Handler mHandler = new Handler(Looper.getMainLooper());

        private Runnable mStatusChecker;
        private int UPDATE_INTERVAL = 2000;

        /**
         * Creates an UIUpdater object, that can be used to
         * perform UIUpdates on a specified time interval.
         * 
         * @param uiUpdater A runnable containing the update routine.
         */
        public UIUpdater(final Runnable uiUpdater) {
            mStatusChecker = new Runnable() {
                @Override
                public void run() {
                    // Run the passed runnable
                    uiUpdater.run();
                    // Re-run it after the update interval
                    mHandler.postDelayed(this, UPDATE_INTERVAL);
                }
            };
        }

        /**
         * The same as the default constructor, but specifying the
         * intended update interval.
         * 
         * @param uiUpdater A runnable containing the update routine.
         * @param interval  The interval over which the routine
         *                  should run (milliseconds).
         */
        public UIUpdater(Runnable uiUpdater, int interval){
            UPDATE_INTERVAL = interval;
            this(uiUpdater);
        }

        /**
         * Starts the periodical update routine (mStatusChecker 
         * adds the callback to the handler).
         */
        public synchronized void startUpdates(){
            mStatusChecker.run();
        }

        /**
         * Stops the periodical update routine from running,
         * by removing the callback.
         */
        public synchronized void stopUpdates(){
            mHandler.removeCallbacks(mStatusChecker);
        }
}

Vous pouvez ensuite créer un UIUpdater objet à l'intérieur de votre classe et de l'utiliser comme ceci:

...
mUIUpdater = new UIUpdater(new Runnable() {
         @Override 
         public void run() {
            // do stuff ...
         }
    });

// Start updates
mUIUpdater.startUpdates();

// Stop updates
mUIUpdater.stopUpdates();
...

Si vous voulez l'utiliser comme une activité de mise à jour, mettez le départ d'appel à l'intérieur de la onResume() la méthode et l'arrêt d'appel à l'intérieur de la onPause(), de sorte que les mises à jour de départ et d'arrêt en fonction de l'activité de la visibilité.

25voto

Nels Beckman Points 9949

Je pense que la nouvelle hotness consiste à utiliser un ScheduledThreadPoolExecutor. Comme suit :

6voto

Nepster Points 893

Timer est une autre façon de faire votre travail, mais se calme bien sûr d’ajouter `` si vous travaillez avec une interface utilisateur.

et xml est...

4voto

user3265196 Points 11

Essayer la suite exemple travaux !!!

Utilisation [gestionnaire] dans onCreate() méthode qui rend l’utilisation de la méthode postDelayed() qui provoque le Runnable soient ajoutés à la file d’attente de messages, pour être exécuté après que le laps de temps qui s’écoule est 0 dans donné exemple. 1

Consulter ce code :

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