Handler postDelayed und Faden.sleep()
Habe ich einen thread.Schlaf-und eine handler-postDelayed in meinem code:
handler.postDelayed(new Runnable() {
@Override
public void run() {
Log.e(TAG, "I ran");
mIsDisconnect = false;
}
}, DISCONNECT_DELAY);
Nachdem die handler, und nachdem der Benutzer die Taste drücken, die ich habe:
while (mIsDisconnect) {
try {
Thread.sleep(DELAY);
} catch (InterruptedException e) {
Log.e(TAG, "problem sleeping");
}
}
Wenn die user lange genug warten ich kann die "ich lief" in meinem log. Aber wenn der Benutzer die Taste drücken, bevor die Verzögerung ist, es scheint, dass die postDelayed nie eine chance zu führen. Meine Frage ist, funktioniert der thread.sleep() Durcheinander mit dem hf postDelayed?
Edit: Der Zweck dieses Kodex ist, dass ich möchte, um fortzufahren, das Programm nur nach DISCONNECT_DELAY Sekunden bereits verstrichen. Also, wenn der Benutzer klickt zu früh, ich muss warten, bis die verstrichene Zeit fertig zu stellen.
Thread.sleep
Blöcke der andere Prozess während postDelayed
nicht.
InformationsquelleAutor Jace | 2013-09-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich gehe davon aus, dass Ihre
handler
verbunden ist, mit dem gleichen thread der anderen Schleife ausgeführt wird. (EinHandler
ist dem thread zugeordnet der Sie erstellt wird.)postDelayed()
stellt dieRunnable
im handler-thread-message-queue. Die message-queue wird verarbeitet, wenn die Kontrolle wieder an den threadLooper
.Thread.sleep()
einfach blockiert der thread. Die Steuern nicht wieder auf dasLooper
und Nachrichten, die nicht verarbeitet werden können. Schlafen in der UI-thread ist fast immer falsch.Zu erreichen, was Sie versuchen zu tun, entfernen Sie den Schlaf und nutzen Sie einfach
postDelayed()
postenRunnable
Sie, dass änderungen, den app-Zustand (wie Sie bereits tun, indem eine member-variablemIsDisconnect
). Dann in deronClick()
einfach mal den app-Zustand (mIsDisconnect
fahne), ob es ok ist zu gehen oder nicht.InformationsquelleAutor laalto
Ich denke, dass der zweite Abschnitt läuft auf dem main thread und Sie bewegt sich nicht zwischen den threads.
Sie können nicht den Haupt-thread auf den Schlaf, die Sie beenden Sie alle UI-Probleme und andere Sachen, die ausgeführt werden soll auf diesen thread (main-thread).
Verwenden
postDelayed
von der hf statt.Ich habe verstanden, dass. Der erste Abschnitt wird nicht passieren, wenn Sie den thread auf den Schlaf. Wieder, vermeiden Sie die Verwendung von ' - Thread.sleep()'. Versuchen Sie zu Lesen developer.android.com/reference/android/os/Handler.html. Sie können hinzufügen oder löschen von Nachrichten aus dem hf, vielleicht hilft es.
InformationsquelleAutor Yaniv
Ist der beste Weg, mit einem sentinel:
InformationsquelleAutor oskarko