Ich möchte eine Pause zwischen zwei Codezeilen machen. Lassen Sie mich ein wenig erklären:
-> Der Benutzer klickt auf eine Schaltfläche (tatsächlich eine Karte) und ich zeige sie, indem ich den Hintergrund dieser Schaltfläche ändere:
thisbutton.setBackgroundResource(R.drawable.icon);
-> Nach einer Sekunde muss ich zum vorherigen Status der Schaltfläche zurückkehren, indem ich den Hintergrund zurücksetze:
thisbutton.setBackgroundResource(R.drawable.defaultcard);
-> Ich habe versucht, den Thread zwischen diesen beiden Codezeilen anzuhalten mit:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Dies funktioniert jedoch nicht. Vielleicht ist es der Prozess und nicht der Thread, den ich anhalten muss?
Ich habe es auch versucht (aber es funktioniert nicht):
new Reminder(5);
Mit diesem:
public class Reminder {
Timer timer;
public Reminder(int seconds) {
timer = new Timer();
timer.schedule(new RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
public void run() {
System.out.format("Time's up!%n");
timer.cancel(); //Terminate the timer thread
}
}
}
Wie kann ich den Thread oder Prozess anhalten / in den Ruhezustand versetzen?
android
process
multithreading
Hubert
quelle
quelle
(!conditionCheck()) {}
normalerweise davon abgeraten wird.Antworten:
Eine Lösung für dieses Problem ist die Verwendung der Handler.postDelayed () -Methode. Einige Google- Schulungsmaterialien schlagen dieselbe Lösung vor.
Einige haben jedoch darauf hingewiesen, dass die obige Lösung einen Speicherverlust verursacht da sie eine nicht statische innere und anonyme Klasse verwendet, die implizit einen Verweis auf ihre äußere Klasse, die Aktivität, enthält. Dies ist ein Problem, wenn im Aktivitätskontext Müll gesammelt wird.
Eine komplexere Lösung, die den Speicherverlust vermeidet, unterteilt die
Handler
undRunnable
mit statischen inneren Klassen innerhalb der Aktivität, da statische innere Klassen keinen impliziten Verweis auf ihre äußere Klasse enthalten:Beachten Sie, dass die
Runnable
Verwendungen ein WeakReference auf die Aktivität, die in einer statischen Klasse notwendig ist , die den Zugriff auf die Benutzeroberfläche benötigt.quelle
final Button mynewbutton = mybutton;
und Verwendungmynewbutton
in der Handler und dem Runnable von dort weiter.Sie können dieses versuchen, es ist kurz
WARNUNG : Tun Sie dies niemals in einem UI-Thread.
Verwenden Sie dies zum Schlafen, z. Hintergrund-Thread.
Die vollständige Lösung für Ihr Problem lautet: Dies ist die verfügbare API 1
Ohne tmp Handler zu erstellen. Auch diese Lösung ist besser als @tronman, da wir die Ansicht von Handler nicht beibehalten. Wir haben auch kein Problem mit dem Handler, der bei einem schlechten Thread erstellt wurde;)
Dokumentation
Code für postDelayed from View-Klasse:
quelle
OMG of course do this in background thread
ist irrelevant, es sei denn, Sie zeigen, wie es in den Hintergrund-Thread eingefügt werden soll. Zu diesem Zeitpunkt werden Sie feststellen, dass Sie eine Antwort haben, die komplizierter ist als die bereits akzeptierte Antwort. Habe ich erwähnt, dass vor drei Jahren eine bessere Lösung akzeptiert wurde? : PHandler + postRunnable
Dies alles in einem einzigen Schritt. Ohne den Systemaufwand für das Erstellen eines zweiten Threads.Ich benutze das:
quelle
e.getLocalizedMessage()
soll der machen?Handler/postDelayed
Lösung hat zwei Vorteile: (1) Vermeidet den System-Overhead des 2. Threads, (1) läuft auf dem UI-Thread und kann so Änderungen an der Benutzeroberfläche vornehmen, ohne eine Ausnahme zu verursachen.Sie wollen es wahrscheinlich nicht so machen. Wenn Sie eine explizite
sleep()
Ereignisbehandlungsroutine in Ihre Ereignisbehandlungsroutine einfügen, wird die gesamte Benutzeroberfläche für eine Sekunde gesperrt. Eine Alternative ist die Verwendung eines Single-Shot- Timers . Erstellen Sie eine TimerTask , um die Hintergrundfarbe wieder in die Standardfarbe zu ändern, und planen Sie sie im Timer.Eine andere Möglichkeit ist die Verwendung eines Handlers . Es gibt ein Tutorial über jemanden, der von einem Timer zu einem Handler gewechselt ist.
Übrigens können Sie einen Prozess nicht anhalten. Ein Java- (oder Android-) Prozess hat mindestens 1 Thread, und Sie können nur Threads in den Ruhezustand versetzen.
quelle
Ich benutze CountDownTime
quelle
Das habe ich am Ende des Tages getan - funktioniert jetzt einwandfrei:
quelle
Zusätzlich zu den Antworten von Herrn Yankowsky könnten Sie auch verwenden
postDelayed()
. Dies ist auf jederView
(z. B. Ihrer Karte) verfügbar und dauert eineRunnable
und eine Verzögerungszeit. Es führt dieRunnable
nach dieser Verzögerung aus.quelle
Das ist mein Beispiel
Erstellen Sie ein Java-Dienstprogramm
quelle
Oder Sie könnten verwenden:
Dies hat den Vorteil, dass keine Verpackung erforderlich ist
try ... catch
.quelle
Wenn Sie Kotlin und Coroutinen verwenden , können Sie dies einfach tun
Und wenn Sie die Benutzeroberfläche aktualisieren müssen
quelle
Ich weiß, dass dies ein alter Thread ist, aber in der Android-Dokumentation habe ich eine Lösung gefunden, die für mich sehr gut funktioniert hat ...
https://developer.android.com/reference/android/os/CountDownTimer.html
Hoffe das hilft jemandem ...
quelle
Und um doppelt sicher zu sein, können Sie es mit der Methode "static class" kombinieren, wie in der Antwort von tronman beschrieben
quelle