Kann jemand ein einfaches Beispiel für die Aktualisierung eines Textfelds jede Sekunde oder so geben?
Ich möchte einen fliegenden Ball machen und muss die Ballkoordinaten jede Sekunde berechnen / aktualisieren. Deshalb brauche ich eine Art Timer.
Ich bekomme nichts von hier .
Antworten:
ok, da dies noch nicht geklärt ist, gibt es 3 einfache Möglichkeiten, damit umzugehen. Unten ist ein Beispiel, das alle 3 zeigt, und unten ist ein Beispiel, das nur die Methode zeigt, die ich für vorzuziehen halte. Denken Sie auch daran, Ihre Aufgaben in onPause zu bereinigen und gegebenenfalls den Status zu speichern.
Das Wichtigste ist, dass die Benutzeroberfläche nur über den Haupt-UI-Thread geändert werden kann. Verwenden Sie daher einen Handler oder activity.runOnUIThread (Runnable r).
Folgendes halte ich für die bevorzugte Methode.
quelle
Es ist einfach! Sie erstellen einen neuen Timer.
Dann erweitern Sie die Timer-Aufgabe
Fügen Sie dann die neue Aufgabe mit einem Aktualisierungsintervall zum Timer hinzu
Haftungsausschluss: Dies ist nicht die ideale Lösung. Dies ist eine Lösung mit der Timer-Klasse (wie von OP gefordert). Im Android SDK wird empfohlen, die Handler-Klasse zu verwenden (die akzeptierte Antwort enthält ein Beispiel).
quelle
Wenn Sie Ihren Code auch im UI-Thread (und nicht im Timer-Thread) ausführen müssen, schauen Sie im Blog nach: http://steve.odyfamily.com/?p=12
quelle
Wenn Sie nur einen Countdown bis zu einem späteren Zeitpunkt mit regelmäßigen Benachrichtigungen in Intervallen planen möchten, können Sie die CountDownTimer- Klasse verwenden, die seit API-Ebene 1 verfügbar ist.
quelle
SS:MiMi
? DankeDies ist ein einfacher Code für einen Timer:
quelle
Ich denke, Sie können es auf Rx-Weise tun wie:
Und stornieren Sie dies wie folgt:
Rx Timer http://reactivex.io/documentation/operators/timer.html
quelle
Da diese Frage immer noch viele Nutzer aus der Google-Suche anzieht (über den Android-Timer), möchte ich meine zwei Münzen einwerfen.
Zunächst wird die Timer- Klasse in Java 9 veraltet sein (lesen Sie die akzeptierte Antwort) .
Der offizielle empfohlene Weg ist die Verwendung von ScheduledThreadPoolExecutor, der effektiver und funktionsreicher ist und zusätzlich Befehle planen kann, die nach einer bestimmten Verzögerung ausgeführt oder regelmäßig ausgeführt werden sollen. Darüber hinaus bietet ThreadPoolExecutor zusätzliche Flexibilität und Funktionen.
Hier ist ein Beispiel für die Verwendung einfacher Funktionen.
Executor Service erstellen:
Planen Sie einfach, dass Sie ausgeführt werden können:
Sie können jetzt
future
die Aufgabe abbrechen oder prüfen, ob sie beispielsweise ausgeführt wurde:Ich hoffe, Sie finden dies nützlich, um Aufgaben in Android zu erstellen.
Vollständiges Beispiel:
quelle
Ich bin überrascht, dass es keine Antwort gibt, die eine Lösung mit RxJava2 erwähnen würde . Es ist wirklich einfach und bietet eine einfache Möglichkeit, den Timer in Android einzurichten.
Zuerst müssen Sie die Gradle-Abhängigkeit einrichten, falls Sie dies noch nicht getan haben:
(ersetzen
x
undy
durch aktuelle Versionsnummer )Da wir nur eine einfache, NICHT WIEDERHOLENDE AUFGABE haben , können wir
Completable
Objekt verwenden:Für REPEATING TASK können Sie
Observable
auf ähnliche Weise Folgendes verwenden :Schedulers.computation()
stellt sicher, dass unser Timer im Hintergrund-Thread ausgeführt wird, und.observeOn(AndroidSchedulers.mainThread())
bedeutet, dass Code, den wir nach Ablauf des Timers ausführen, im Haupt-Thread ausgeführt wird.Um unerwünschte Speicherverluste zu vermeiden, sollten Sie sicherstellen, dass Sie sich abmelden, wenn Aktivität / Fragment zerstört wird.
quelle
Subscription
zurückgegebene by-.subscribe()
Methode in der Variablen und rufensubscription.unsubscribe()
Sie sie auf, wenn Sie den Timer stoppen möchten.Er ist eine einfachere Lösung, funktioniert gut in meiner App.
quelle
Sie möchten, dass Ihre UI-Updates im bereits vorhandenen UI-Thread erfolgen.
Der beste Weg ist, einen Handler zu verwenden, der postDelayed verwendet, um ein Runnable nach einer Verzögerung auszuführen (jeder Lauf plant den nächsten). Löschen Sie den Rückruf mit removeCallbacks.
Sie suchen bereits an der richtigen Stelle. Sehen Sie sich das noch einmal an und klären Sie vielleicht, warum dieses Codebeispiel nicht Ihren Wünschen entspricht. (Siehe auch den identischen Artikel unter Aktualisieren der Benutzeroberfläche von einem Timer ).
quelle
Hier ist ein einfacher zuverlässiger Weg ...
Fügen Sie den folgenden Code in Ihre Aktivität ein, und die tick () -Methode wird jede Sekunde im UI-Thread aufgerufen, während sich Ihre Aktivität im Status "Wieder aufgenommen" befindet. Natürlich können Sie die tick () -Methode ändern, um das zu tun, was Sie wollen, oder um mehr oder weniger häufig aufgerufen zu werden.
Für Interessenten ist der Code "_h0 = _handler" erforderlich, um zu vermeiden, dass zwei Timer gleichzeitig ausgeführt werden, wenn Ihre Aktivität innerhalb des Tick-Zeitraums angehalten und fortgesetzt wird.
quelle
_h0
Ansatz, stattremoveCallbacks
inonPause
, wie jeder andere auch?Sie können auch einen Animator dafür verwenden:
quelle
Sie müssen einen Thread erstellen, um die Aktualisierungsschleife zu verarbeiten, und ihn zum Aktualisieren des Textbereichs verwenden. Der schwierige Teil ist jedoch, dass nur der Haupt-Thread die Benutzeroberfläche tatsächlich ändern kann, sodass der Update-Loop-Thread dem Haupt-Thread signalisieren muss, das Update durchzuführen. Dies erfolgt mit einem Handler.
Schauen Sie sich diesen Link an: http://developer.android.com/guide/topics/ui/dialogs.html# Klicken Sie auf den Abschnitt "Beispiel für einen Fortschrittsdialog mit einem zweiten Thread". Dies ist ein Beispiel dafür, was genau Sie tun müssen, außer mit einem Fortschrittsdialog anstelle eines Textfelds.
quelle
quelle
Wenn jemand interessiert ist, habe ich angefangen, ein Standardobjekt zu erstellen, das auf einem Aktivitäts-UI-Thread ausgeführt werden soll. Scheint in Ordnung zu funktionieren. Kommentare willkommen. Ich würde es lieben, wenn dies im Layout-Designer als Komponente zum Ziehen auf eine Aktivität verfügbar wäre. Ich kann nicht glauben, dass so etwas noch nicht existiert.
In der Aktivität habe ich diesen onStart:
quelle
.xml
quelle
Wenn Sie bereits Deltazeit haben.
quelle
Ich abstrahiere Timer weg und mache es zu einer separaten Klasse:
Und extrahieren Sie die Hauptaktion aus der
Timer
Klasse alsUnd ich habe es einfach so benutzt:
Ich hoffe das hilft 😊👌
quelle
Ich benutze diesen Weg:
dann unter dem onCreate
Es ist ein einfacher Weg, um dieses Problem zu lösen.
quelle
Für diejenigen, die sich nicht auf Chronometer verlassen können , habe ich aus einem der Vorschläge eine Utility-Klasse erstellt:
zu verwenden .. nur tun:
..... .....
quelle