Was entspricht einem JavaScript setInterval / setTimeout in Android / Java?


129

Kann mir jemand sagen, ob es für Android ein Äquivalent für setInterval / setTimeout gibt? Hat jemand ein Beispiel dafür, wie es geht?

Antworten:


245

Wie immer bei Android gibt es viele Möglichkeiten, dies zu tun, aber vorausgesetzt, Sie möchten einfach ein Stück Code etwas später im selben Thread ausführen, verwende ich Folgendes:

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

.. das ist so ziemlich gleichbedeutend mit

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

Dies ist eine sehr gute Lösung für Schubladenauswahl und Fragmenttransaktion
Gonçalo

6
Wie kann ich es stornieren, wenn ich muss?
Quentin Roy

Wie erhalten Sie den Aktivitätsbereich innerhalb der run () -Methode?
Andy

@ Andy wie folgt:MyActivityName.this.myFunctionOnActivity()
Ben Clayton

1
@ QuentinRoy: Handler timeout = new Handler(); final Runnable r = new Runnable{...}; timeout.postDelayed(r, 300);und wenn Sie es abbrechen möchten:timeout.removeCallbacks(r);
Bastian Springer

101

setInterval ()

Funktion, die sich alle n Millisekunden wiederholt

Javascript

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

Ungefähres Java- Äquivalent

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

setTimeout ()

Funktion, die erst nach n Millisekunden funktioniert

Javascript

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

Ungefähres Java- Äquivalent

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

5
scheduleAtFixedRateWie können Sie für die Methode den Timer innerhalb der Aktivität abbrechen, wenn diese Aktivität beendet ist?
Auroranil

2
@ user824294 Sie können Ihre Timer-Instanz in einer Variablen speichern und "cancel ()" aufrufen, wenn Sie die geplanten Aufgaben stoppen möchten - Timer t = new Timer (); t.scheduleAtFixedRate (...); - Und dann t.cancel () aufrufen; wann immer du willst.
Aebsubis

14

Wenn Sie sich keine Sorgen machen, Ihr Telefon aufzuwecken oder Ihre App von den Toten zurückzubringen, versuchen Sie Folgendes:

// 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.
handler.removeCallbacks(runnable);

Auf meinem Telefon (Huawei P Smart) weckt der Handler das Gerät nicht aus dem Ruhemodus ( wie von apanloco in einer anderen Antwort bemerkt )
Franco

13

Je nachdem, was Sie tatsächlich erreichen möchten, sollten Sie sich die Android-Handler ansehen:

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

Wenn Sie zuvor Javascript setTimeout () usw. verwendet haben, um eine Aufgabe zu planen, die in Zukunft ausgeführt werden soll, ist dies die Android-Methode (postDelayed / sendMessageDelayed).

Beachten Sie, dass weder Handler noch Timer ein Android-Telefon aus dem Ruhemodus aktivieren. Mit anderen Worten, wenn Sie planen möchten, dass tatsächlich etwas passiert, obwohl der Bildschirm ausgeschaltet ist / die CPU schläft, müssen Sie auch den AlarmManager überprüfen.


5

Ich weiß nicht viel über JavaScript, aber ich denke, Timer könnten das sein, wonach Sie suchen.

http://developer.android.com/reference/java/util/Timer.html

Über den Link:

One-Shot soll zu einem absoluten Zeitpunkt oder nach einer relativen Verzögerung ausgeführt werden. Wiederkehrende Aufgaben werden entweder mit einem festen Zeitraum oder einer festen Rate geplant.


Hinweis: Es ruft Sie in einem Hintergrundthread auf, nicht im Haupt- / UI-Thread.
Pang

Dies ist keine Antwort, sondern ein Verweis auf externe Informationen, die möglicherweise sogar die OP-Lösung enthalten oder nicht. Bitte fügen Sie den entsprechenden Code ein, den OP verwenden kann!
Lev

5

Die erste Antwort ist definitiv die richtige Antwort und das ist es, worauf ich diese Lambda-Version gestützt habe, deren Syntax viel kürzer ist. Da Runnable nur eine Überschreibungsmethode "run ()" hat, können wir ein Lambda verwenden:

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

5
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

Hier ist ein setTimeout-Äquivalent, das vor allem nützlich ist, wenn Sie versuchen, die Benutzeroberfläche nach einer Verzögerung zu aktualisieren.

Wie Sie vielleicht wissen, kann die Aktualisierung der Benutzeroberfläche nur über den UI-Thread erfolgen. AsyncTask erledigt dies für Sie, indem es die onPostExecute-Methode von diesem Thread aus aufruft.

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
1. In ähnlicher Weise onProgressUpdate()kann auch zur Simulation verwendet werden setInterval(). 2. AsyncTask läuft auf einem Thread-Pool (oder nur einem einzelnen Thread), also a. es muss möglicherweise warten, bis ein anderer AsyncTaskfertig ist; b . Es wird einen Thread aus dem Pool aufnehmen.
Pang

In diesem Zusammenhang gibt es viele Probleme bei der Verwendung von asynchronen Aufgaben (nur ein Thread und das Sperren eines Threads ohne Grund) - die anderen Lösungen sind viel besser.
Elemental

4

Ich habe einen MP3-Player für Android erstellt und wollte die aktuelle Zeit alle 500 ms aktualisieren also habe ich es so gemacht

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);
}

das ruft die gleiche Methode rekursiv auf

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.