Sollte HandlerThreads, die von meiner Anwendung erstellt wurden, manuell geschlossen werden, wenn die Aktivität zerstört wird?

9

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 ().

    
Daniel L. 18.02.2013, 08:42
quelle

5 Antworten

1
  • Sie müssen dort einige Inkonsistenzen haben, sonst würde Ihre App nicht abstürzen. Sind Sie sicher, dass ein HandlerThread, der nicht läuft wirklich der Grund ist? Erstellen Sie keine HandlerThread-Objekte, wenn Ihre Aktivität erstellt wird?
  • Wenn Ihre HandlerThreads auf E / A-Operationen warten, würde ich versuchen, sie zu unterbrechen. Wenn Sie einfach Callbacks und Nachrichten entfernen und den Looper auffordern, den Vorgang abzubrechen, wird das Senden von Temprinationsnachrichten an den Handler nichts bewirken. Das HandlerThread-Objekt wird immer noch vorhanden sein, bis Android den Prozess beendet hat (was möglicherweise nicht der Fall ist). Dies bedeutet, dass "Ihre App Zombie HandlerThread-Objekte sammelt", die wahrscheinlich nicht erreichbar sind. Es sei denn natürlich, Sie können diesen HandlerThreads eine Beendigungsnachricht senden, die auf dem Kanal ankommt, auf dem sie blockieren.
  • Es wäre viel besser, die HandlerThread-Objekte erneut zu verwenden. Ein Service könnte das richtige Modell dafür sein.
  • Auch wenn Threads deine Aktivität überleben, musst du sie darüber informieren, dass ihr Kommunikationspartner (deine Aktivität) verschwunden ist. Ansonsten können sie sich auf etwas beziehen, das bereits weg ist.
class stacker 18.02.2013, 09:01
quelle
3

Ja, es wäre eine gute Idee, es zu schließen. Stellen Sie außerdem sicher, dass Sie Ihre Rückrufe entfernen.

%Vor%     
Andy McSherry 18.02.2013 08:46
quelle
0

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:

Ссылка

    
Anup Cowkur 18.02.2013 08:50
quelle
0

Der HandlerThread wird gestoppt, wenn der Looper beendet wird. HandlerThread.getLooper (). Quit () wenn Sie Ihre Aktivität beenden. (Siehe Ссылка für ein gutes Beispiel für eine ordnungsgemäße HandlerThread Verwendung)

    
njzk2 18.02.2013 09:01
quelle
0
%Vor%

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.

    
Ql An 02.02.2015 16:11
quelle