web-dev-qa-db-fra.com

Quel est l'équivalent d'un setInterval / setTimeout JavaScript sous Android / Java?

Quelqu'un peut-il me dire s'il existe un équivalent pour setInterval/setTimeout pour Android? Est-ce que quelqu'un a un exemple sur la façon de le faire?

110
karse23

Comme toujours avec Android, il existe de nombreuses façons de le faire, mais en supposant que vous souhaitiez simplement exécuter un morceau de code un peu plus tard sur le même fil, j'utilise ceci:

new Android.os.Handler().postDelayed(
    new Runnable() {
        public void run() {
            Log.i("tag", "This'll run 300 milliseconds later");
        }
    }, 
300);

.. c'est à peu près équivalent à

setTimeout( 
    function() {
        console.log("This will run 300 milliseconds later");
    },
300);
217
Ben Clayton

setInterval ()

fonction qui se répète toutes les n millisecondes

Javascript

 setInterval(function(){ Console.log("A Kiss every 5 seconds"); }, 5000);

Approximatif Java Equivalent

new Timer().scheduleAtFixedRate(new TimerTask(){
    @Override
    public void run(){
       Log.i("tag", "A Kiss every 5 seconds");
    }
},0,5000);

setTimeout ()

fonction qui ne fonctionne qu'après n millisecondes

Javascript

setTimeout(function(){ Console.log("A Kiss after 5 seconds"); },5000);

Approximatif Java Equivalent

new Android.os.Handler().postDelayed(
    new Runnable() {
        public void run() {
            Log.i("tag","A Kiss after 5 seconds");
        }
}, 5000);
82
Midhun

Selon ce que vous voulez réellement réaliser, vous devriez jeter un œil à Android Gestionnaires:

http://developer.Android.com/reference/Android/os/Handler.html

Si vous avez déjà utilisé javascript setTimeout (), etc. pour planifier l'exécution ultérieure d'une tâche, il s'agit de la manière Android de la réaliser (postDelayed/sendMessageDelayed).

Notez que ni les gestionnaires ni les minuteries ne = Android sortent du mode veille. En d'autres termes, si vous souhaitez programmer quelque chose de se produire même si l'écran est éteint/l'unité centrale est en veille, vous devez également consulter AlarmManager.

12
apanloco

Si vous ne craignez pas de réveiller votre téléphone ou de ramener votre application d'entre les morts, essayez:

// Param is optional, to run task on UI thread.     
Handler handler = new Handler(Looper.getMainLooper());
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        // Do the task...
        handler.postDelayed(this, milliseconds) // Optional, to repeat the task.
    }
};
handler.postDelayed(runnable, milliseconds);

// Stop a repeating task like this.
hander.removeCallbacks(runnable);
11
SharkAlley

Je ne connais pas beaucoup JavaScript, mais je pense que les minuteries sont peut-être ce que vous recherchez.

http://developer.Android.com/reference/Java/util/Timer.html

Du lien:

One-shot sont programmés pour s'exécuter à une heure absolue ou après un délai relatif. Les tâches récurrentes sont planifiées avec une période ou un taux fixes.

5
nicholas.hauschild
import Java.util.Timer;
import Java.util.TimerTask;

class Clock {
    private Timer mTimer = new Timer();

    private int mSecondsPassed = 0;
    private TimerTask mTask = new TimerTask() {
        @Override
        public void run() {
            mSecondsPassed++;
            System.out.println("Seconds passed: " + mSecondsPassed);
        }
    };

    private void start() {
        mTimer.scheduleAtFixedRate(mTask, 1000, 1000);
    }

    public static void main(String[] args) {
        Clock c = new Clock();
        c.start();
    }
}
4
Jeeva

La première réponse est certainement la bonne réponse et c’est ce sur quoi j’ai basé cette version de lambda, dont la syntaxe est beaucoup plus courte. Puisque Runnable a seulement 1 méthode de substitution "run ()", nous pouvons utiliser un lambda:

this.m_someBoolFlag = false;
new Android.os.Handler().postDelayed(() -> this.m_someBoolFlag = true, 300);
3
neoRiley

Voici un équivalent de setTimeout, particulièrement utile lorsque vous essayez de mettre à jour l'interface utilisateur après un délai.

Comme vous le savez peut-être, la mise à jour de l'interface utilisateur ne peut être effectuée qu'à partir du thread d'interface utilisateur. AsyncTask le fait pour vous en appelant sa méthode onPostExecute à partir de ce thread.

new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // Update the User Interface
        }

    }.execute();
3
Stephane JAIS

Je créais un lecteur mp3 pour Android, je voulais mettre à jour l'heure actuelle tous les 500ms alors je l'ai fait comme ceci

setInterval

private void update() {
    new Android.os.Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            long cur = player.getCurrentPosition();
            long dur = player.getDuration();
            currentTime = millisecondsToTime(cur);
            currentTimeView.setText(currentTime);
            if (cur < dur) {
                updatePlayer();
            }

            // update seekbar
            seekBar.setProgress( (int) Math.round((float)cur / (float)dur * 100f));
        }
    }, 500);
}

qui appelle la même méthode récursivement

2
Jeeva