Meine App besteht aus einem einzelnen Activity
. In dieser Aktivität erstelle ich mehrere HandlerThread
s, die in einer Schleife laufen, um Socket-Blocking-Operationen durchzuführen.
Momentan poste ich eine Quit-Nachricht an jeden dieser HandlerThread
s während meiner Activity.onDestroy()
.
Manchmal, wenn ich meine App öffne, schließe und neu starte, stürzt sie ab (viele Male, weil ich eine Nachricht an einen Handler-Thread gepostet habe, der nicht läuft).
Meine Frage ist: Was ist der richtige Weg, um HandlerThread
zu schließen, wenn ich meine App schließe? (Beachten Sie, dass diese Threads bei einer Socket-Operation möglicherweise blockiert werden).
BEARBEITEN: Weitere Informationen: Ich habe einen Pool von Handler-Threads, der in onCreate initiiert wird (Kein Problem, wenn ich meine App zum ersten Mal starte).
Jede ausführbare RUN-Schleife wird mit einem
umschlossen %Vor%Aussage.
Die close-Methode entfernt alle ausstehenden Nachrichten und Runnables und sendet eine Nachricht an den Handler, die ihn dazu bringt, sein looper.quit()
aufzurufen.
Wenn der aktuelle Handler-Thread durch den IO-Vorgang blockiert wird, wird er nur einmal beendet ().
Ja, es wäre eine gute Idee, es zu schließen. Stellen Sie außerdem sicher, dass Sie Ihre Rückrufe entfernen.
%Vor% Der Best Practices-Ansatz bestünde darin, die Rückrufe zu Ihren Handlern in Ihren Aktivitäten onDestroy()
zu entfernen. Siehe diese Antwort für mehr:
Oben ist die 'quit' Methode des Quellcodes von HandlerThread.java, rufen Sie sie einfach direkt auf.
Warum sollte man aufhören? Unten ist 'run' Methode des Quellcodes von HandlerThread.java.
%Vor%Die Antwort ist 'loop is a' while (true) 'Methode, es wird zurückkehren, bis eine Nachricht mit Null-Ziel empfangen wird.
Tags und Links android activity-lifecycle android-handler