Ich habe eine Variable in meinem Code, die sagt, es sei "Status".
Ich möchte in Abhängigkeit von diesem Variablenwert Text in der Anwendung anzeigen. Dies muss mit einer bestimmten Zeitverzögerung erfolgen.
Es ist wie,
Überprüfen Sie den Wert der Statusvariablen
Zeigen Sie Text an
Warten Sie 10 Sekunden
Überprüfen Sie den Wert der Statusvariablen
Zeigen Sie Text an
Warten Sie 15 Sekunden
und so weiter. Die Zeitverzögerung kann variieren und wird eingestellt, sobald der Text angezeigt wird.
Ich habe es versucht Thread.sleep(time delay)
und es ist fehlgeschlagen. Gibt es einen besseren Weg, um dies zu erreichen?
android
android-thread
Kalpa Pathum Welivitigoda
quelle
quelle
Antworten:
Sie sollten verwenden
Handler
‚s -postDelayed
Funktion für diesen Zweck. Ihr Code wird mit der angegebenen Verzögerung im Haupt-UI-Thread ausgeführt, sodass Sie die UI-Steuerelemente aktualisieren können.quelle
Für alle Interessierten ist hier eine Klasse, die ich mit inazaruks Code erstellt habe und die alles Notwendige erstellt (ich habe sie UIUpdater genannt, weil ich damit die Benutzeroberfläche regelmäßig aktualisiere, aber Sie können sie beliebig nennen):
Sie können dann ein UIUpdater-Objekt in Ihrer Klasse erstellen und wie folgt verwenden:
Wenn Sie dies als Aktivitätsaktualisierungsprogramm verwenden möchten, fügen Sie den Startaufruf in die onResume () -Methode und den Stoppaufruf in die onPause () -Methode ein, damit die Aktualisierungen entsprechend der Aktivitätssichtbarkeit gestartet und gestoppt werden.
quelle
UPDATE_INTERVAL = interval;
sollte vorthis(uiUpdater);
in stehenUIUpdater(Runnable uiUpdater, int interval)
(da der Wert vonUPDATE_INTERVAL
verwendet wird und als Parameter übergeben werden sollteinterval;
). Vermeiden Sie auch eine Breite von über 80 Zeichen im Code, wenn möglich (fast immer;)new Handler(Looper.getMainLooper())
. Zweitens werden keine Argumente validiert, sodass keine Runnables und negativen Intervalle verschluckt werden. Schließlich werden weder die in deruiUpdater.run()
Zeile verbrachte Zeit berücksichtigt noch mögliche Ausnahmen behandelt, die von dieser Methode ausgelöst werden. Auch ist es nicht threadsicher, Sie sollten Methoden erstellenstart
undstop
synchronisieren.error: call to this must be first statement in constructor
Vielleicht gibt es eine einfache Lösung.Ich denke, die neue Hotness ist die Verwendung eines ScheduledThreadPoolExecutor . Wie so:
quelle
Executors.newSingleThreadScheduledExecutor()
kann hier eine andere Option sein.Timer funktioniert gut. Hier verwende ich Timer, um Text nach 1,5 Sekunden zu suchen und die Benutzeroberfläche zu aktualisieren. Hoffentlich hilft das.
quelle
Es gibt drei Möglichkeiten, dies zu tun:
Verwenden Sie ScheduledThreadPoolExecutor
Ein bisschen übertrieben, da du keinen Thread-Pool brauchst
Timer-Aufgabe verwenden
Alter Android-Stil
Verwenden Sie Handler und Runnable
Moderner Android-Stil
Nicht undichter Handler mit Aktivität / Kontext
Deklarieren Sie eine innere Handler-Klasse, bei der in Ihrer Activity / Fragment-Klasse kein Speicher verloren geht
Deklarieren Sie eine ausführbare Datei, die Ihre sich wiederholende Aufgabe in Ihrer Aktivitäts- / Fragmentklasse ausführt
Initialisieren Sie das Handler-Objekt in Ihrer Aktivität / Ihrem Fragment (hier ist FlashActivity meine Aktivitätsklasse).
Wiederholen einer Aufgabe nach einem festgelegten Zeitintervall
Um die Wiederholung der Aufgabe zu stoppen
UPDATE: In Kotlin:
quelle
Der Timer ist eine weitere Möglichkeit, Ihre Arbeit zu erledigen. Fügen Sie ihn jedoch unbedingt hinzu,
runOnUiThread
wenn Sie mit der Benutzeroberfläche arbeiten.und xml ist ...
Planen Sie einen Countdown bis zu einem späteren Zeitpunkt mit regelmäßigen Benachrichtigungen in Intervallen auf dem Weg. Beispiel für die Anzeige eines 30-Sekunden-Countdowns in einem Textfeld:
Für Details
quelle
Versuchen Sie folgendes Beispiel, es funktioniert !!!
Verwenden Sie [Handler] in der onCreate () -Methode, die die postDelayed () -Methode verwendet, mit der die ausführbare Datei zur Nachrichtenwarteschlange hinzugefügt wird, nachdem die angegebene Zeitspanne abgelaufen ist, die im angegebenen Beispiel 0 ist. 1
Verweisen Sie auf diesen Code:
quelle
Sie können einen Handler verwenden, um ausführbaren Code zu veröffentlichen. Diese Technik wird hier sehr gut beschrieben: https://guides.codepath.com/android/Repeating-Periodic-Tasks
quelle
Basierend auf dem obigen Beitrag zum ScheduledThreadPoolExecutor habe ich ein Dienstprogramm entwickelt, das meinen Anforderungen entspricht (ich wollte alle 3 Sekunden eine Methode auslösen):
quelle
In meinem Fall musste ich einen Prozess ausführen, wenn eine dieser Bedingungen erfüllt war: wenn ein vorheriger Prozess abgeschlossen wurde oder wenn bereits 5 Sekunden vergangen waren. Also habe ich folgendes gemacht und ziemlich gut gearbeitet:
Wenn Prozess1 gelesen wird, wird Prozess2 ausgeführt. Wenn nicht, werden die variablen Zeiten erhöht und der Handler nach einer Sekunde ausgeführt. Es behält eine Schleife bei, bis process1 gelesen wird oder times 5 ist. Wenn times 5 ist, bedeutet dies, dass 5 Sekunden vergangen sind und in jeder Sekunde die if-Klausel von process1.isRead () ausgeführt wird.
quelle
Wenn Sie Kotlin und seine Coroutine verwenden, ist es ganz einfach, zuerst einen Job in Ihrer Klasse (besser in Ihrem viewModel) wie folgt zu deklarieren:
Wenn Sie es dann erstellen und starten möchten, gehen Sie folgendermaßen vor:
und wenn du es beenden willst:
PS:
viewModelScope
ist nur in Ansichtsmodellen verfügbar. Sie können auch andere Coroutine-Bereiche verwenden, zwithContext(Dispatchers.IO)
Weitere Informationen: Hier
quelle
Für Benutzer von Kotlin funktioniert die Antwort von inazaruk nicht. Für die IDE muss die Variable initialisiert werden. Anstatt das
postDelayed
Innere von zu verwendenRunnable
, verwenden wir sie in einer separaten Methode.Initialisieren Sie dies
Runnable
wie folgt :Initialisieren Sie Ihre
runDelayedHandler
Methode folgendermaßen:Wie Sie sehen können, können Sie mit diesem Ansatz die Lebensdauer der Aufgabe steuern. Wenn Sie
keepRunning
diese während der Lebensdauer der Anwendung verfolgen und ändern, wird dies für Sie erledigt.quelle