Ich möchte die folgende Methode nach einer bestimmten Verzögerung aufrufen können. In Ziel c gab es so etwas wie:
[self performSelector:@selector(DoSomething) withObject:nil afterDelay:5];
Gibt es ein Äquivalent dieser Methode in Android mit Java? Zum Beispiel muss ich in der Lage sein, nach 5 Sekunden eine Methode aufzurufen.
public void DoSomething()
{
//do something here
}
removeCallbacks(Runnable r)
auf demHandler
.import android.os.handler
Ich konnte keine der anderen Antworten in meinem Fall verwenden. Ich habe stattdessen den nativen Java-Timer verwendet.
quelle
Hinweis: Diese Antwort wurde gegeben, als in der Frage Android nicht als Kontext angegeben wurde. Eine Antwort speziell für den Android-UI-Thread finden Sie hier.
Es sieht so aus, als ob die Mac OS-API den aktuellen Thread fortsetzen lässt und die asynchrone Ausführung der Aufgabe plant. In Java wird die entsprechende Funktion vom
java.util.concurrent
Paket bereitgestellt. Ich bin mir nicht sicher, welche Einschränkungen Android auferlegen könnte.quelle
ScheduledFuture<?>
zurückgegebene vonworker.schedule()
und rufen Sie dessencancel(boolean)
Methode auf.ScheduledExecutorService
.Für die Ausführung von etwas im UI-Thread nach 5 Sekunden:
quelle
Sie können Handler in UIThread verwenden:
quelle
Vielen Dank für all die tollen Antworten. Ich habe eine Lösung gefunden, die meinen Anforderungen am besten entspricht.
quelle
1. Verwenden von
Handler
2. Verwenden von TimerTask
Oder noch kürzer
Oder am kürzesten wäre
3. Verwenden von
Executors
1. Verwenden von
Handler
2. Verwenden von
Timer
3. Verwenden von
ScheduledExecutorService
quelle
How to call a method after a delay in Android
. Darauf habe ich mich konzentriert. Auf den Punkt. Andernfalls ist Java-Lecks ein großes Thema, das Entwickler separat verstehen müssen.Sehen Sie diese Demo:
quelle
Wenn Sie den Handler verwenden müssen, sich aber in einem anderen Thread befinden, können Sie
runonuithread
den Handler im UI-Thread ausführen. Dies erspart Ihnen Ausnahmen, die beim Anruf ausgelöst werdenLooper.Prepare()
Sieht ziemlich chaotisch aus, aber das ist einer der Wege.
quelle
Ich bevorzuge die
View.postDelayed()
Methode, einfachen Code unten:quelle
Hier ist meine kürzeste Lösung:
quelle
quelle
Wenn Sie Android Studio 3.0 und höher verwenden, können Sie Lambda-Ausdrücke verwenden. Die Methode
callMyMethod()
wird nach 2 Sekunden aufgerufen:Falls Sie die verzögerte Ausführung abbrechen müssen, verwenden Sie Folgendes:
quelle
Ich schlage den Timer vor , mit dem Sie eine Methode planen können, die in einem bestimmten Intervall aufgerufen werden soll. Dadurch wird Ihre Benutzeroberfläche nicht blockiert und Ihre App bleibt während der Ausführung der Methode reaktionsfähig.
Die andere Option ist wait (); Methode blockiert dies den aktuellen Thread für die angegebene Zeitdauer. Dies führt dazu, dass Ihre Benutzeroberfläche nicht mehr reagiert, wenn Sie dies im UI-Thread tun.
quelle
Für eine Verzögerung bei der einfachen Zeilenbehandlung können Sie wie folgt vorgehen:
ich hoffe das hilft
quelle
Sie können dies für die einfachste Lösung verwenden:
Andernfalls kann unten eine andere saubere nützliche Lösung sein:
quelle
Sie können es viel sauberer machen, indem Sie die neu eingeführten Lambda-Ausdrücke verwenden:
quelle
Es gibt also ein paar Dinge zu beachten, da es so viele Möglichkeiten gibt, diese Katze zu häuten. Obwohl alle Antworten bereits ausgewählt und ausgewählt wurden. Ich denke, es ist wichtig, dass dies mit den richtigen Codierungsrichtlinien überprüft wird, um zu vermeiden, dass jemand in die falsche Richtung geht, nur weil "die Mehrheit die einfache Antwort ausgewählt hat".
Lassen Sie uns zunächst die einfache Antwort "Post Delayed" diskutieren, bei der es sich insgesamt um die vom Gewinner ausgewählte Antwort in diesem Thread handelt.
Ein paar Dinge zu beachten. Nach der Nachverzögerung können Speicherlecks, tote Objekte, verschwundene Lebenszyklen und mehr auftreten. Daher ist es auch wichtig, richtig damit umzugehen. Sie können dies auf verschiedene Arten tun.
Für die moderne Entwicklung werde ich in KOTLIN liefern
Hier ist ein einfaches Beispiel für die Verwendung des UI-Threads bei einem Rückruf und die Bestätigung, dass Ihre Aktivität noch aktiv ist, wenn Sie Ihren Rückruf ausführen.
Dies ist jedoch immer noch nicht perfekt, da es keinen Grund gibt, Ihren Rückruf zu tätigen, wenn die Aktivität abgebrochen wurde. Ein besserer Weg wäre es, einen Verweis darauf zu behalten und die Rückrufe wie diesen zu entfernen.
und natürlich die Bereinigung in der onPause durchführen, damit der Rückruf nicht getroffen wird.
Nachdem wir das Offensichtliche besprochen haben, sprechen wir über eine sauberere Option mit modernen Coroutinen und Kotlin :). Wenn Sie diese noch nicht verwenden, verpassen Sie sie wirklich.
oder wenn Sie mit dieser Methode immer einen UI-Start durchführen möchten, können Sie einfach Folgendes tun:
Natürlich müssen Sie genau wie beim PostDelayed sicherstellen, dass Sie mit dem Abbrechen umgehen, damit Sie entweder die Aktivitätsprüfungen nach dem Verspätungsaufruf durchführen oder sie in der onPause wie auf der anderen Route abbrechen können.
// Bereinigung behandeln
Wenn Sie den Start (UI) in die Methodensignatur einfügen, kann der Job in der aufrufenden Codezeile zugewiesen werden.
Die Moral der Geschichte ist es also, mit Ihren verspäteten Aktionen sicher zu sein, sicherzustellen, dass Sie Ihre Rückrufe entfernen oder Ihre Jobs stornieren, und natürlich zu bestätigen, dass Sie den richtigen Lebenszyklus haben, um Elemente Ihres verspäteten Rückrufs vollständig zu berühren. Die Coroutinen bieten auch stornierbare Aktionen an.
Es ist auch erwähnenswert, dass Sie normalerweise die verschiedenen Ausnahmen behandeln sollten, die mit Coroutinen einhergehen können. Zum Beispiel eine Stornierung, eine Ausnahme, eine Zeitüberschreitung, was auch immer Sie verwenden möchten. Hier ist ein fortgeschritteneres Beispiel, wenn Sie sich entscheiden, Coroutinen wirklich zu verwenden.
quelle
Ich habe eine einfachere Methode erstellt, um dies aufzurufen.
Um es zu benutzen, rufen Sie einfach an:
.CallWithDelay(5000, this, "DoSomething");
quelle
performSelector
. Dies ist der beste Weg.Unten funktioniert man, wenn man bekommt,
quelle
Mit Kotlin können wir Folgendes erreichen
quelle
Es ist sehr einfach mit dem
CountDownTimer
. Weitere Informationen finden Sie unter https://developer.android.com/reference/android/os/CountDownTimer.htmlquelle
Wenn Sie RxAndroid verwenden, wird die Behandlung von Threads und Fehlern viel einfacher. Der folgende Code wird nach einer Verzögerung ausgeführt
quelle
Jeder scheint zu vergessen, den Handler zu bereinigen, bevor er eine neue ausführbare Datei oder Nachricht darauf veröffentlicht. Andernfalls könnten sie sich möglicherweise ansammeln und schlechtes Verhalten verursachen.
quelle
Hier ist ein weiterer kniffliger Weg: Es wird keine Ausnahme ausgelöst, wenn die ausführbaren Elemente der Benutzeroberfläche geändert werden.
Sie können die Animation folgendermaßen aufrufen:
Die Animation kann an jede Ansicht angehängt werden.
quelle
Hier ist die Antwort in Kotlin, ihr faulen, faulen Leute:
quelle
Ich mag Dinge sauberer: Hier ist meine Implementierung, Inline-Code, der in Ihrer Methode verwendet werden kann
quelle
Eine geeignete Lösung für Android:
quelle
Ähnliche Lösung, aber viel sauberer zu verwenden
Schreiben Sie diese Funktion außerhalb der Klasse
Verwendungszweck:
quelle
do
ist eine eingebaute Methode, daher müssen wir `verwenden, um sie als Variablennamen zu verwendendo
so nach einer Verzögerung von 3 SekundenIn Android können wir unten Kotlin-Code schreiben, um die Ausführung einer Funktion zu verzögern
quelle