Ich stieß auf diesen Code in einem sehr einfachen Handler-Tutorial. Der Code funktioniert gut, aber ich verstehe nicht, warum ich Handler für progressDialog.dismiss()
??? Ich entfernte den Handler-Teil und platzierte progressDialog.dismiss()
in der run()
-Methode und es funktionierte gut. Also warum benutzt Handler ???
In der Dokumentation von View
:
Sie müssen immer im UIhread sein, wenn Sie eine Methode für eine aufrufen anzeigen. Wenn Sie an anderen Threads arbeiten und die Status einer Ansicht von diesem Thread, sollten Sie ein
Handler
verwenden.
Wenn Sie in Ihrem Beispiel die dismiss()
-Methode für ProgressDialog
aufrufen müssen, wie in der obigen Dokumentation beschrieben, müssen Sie dies über den UInthread tun. % Co_de% wird auf eine Instanz von messageHandler
initialisiert, wenn die Klasse Handler
instanziiert wird (vermutlich im UI-Thread).
Aus der Dokumentation von HandlerThread
:
Jede
Handler
-Instanz ist einem einzelnen Thread zugeordnet Thread-Nachrichtenwarteschlange. Wenn Sie ein neuesHandler
erstellen, ist es gebunden die Thread / Nachrichtenwarteschlange des Threads, der sie erstellt - von An diesem Punkt werden Nachrichten und Runnables an diese Nachricht gesendet Warteschlange und führe sie aus, sobald sie aus der Nachrichtenwarteschlange kommen.
Um also mit dem Benutzeroberflächenthread aus Ihrem neuen Thread zu kommunizieren, senden Sie einfach eine Nachricht an die Handler
, die im Benutzeroberflächen-Thread erstellt wurde.
Wenn Sie Methoden außerhalb des UI-Threads für eine Handler
aufrufen, ruft sie undefiniertes Verhalten auf, was bedeutet, dass eventuell angezeigt wird, damit sie funktioniert. Aber es ist nicht immer garantiert gut zu funktionieren.
Zuerst: Lassen Sie uns wissen, was Thread ist:
Zweitens: Lassen Sie uns den Anwendungsthread wissen: -
Android UI-Toolkit ist nicht threadsicher
Handler-Klasse:
android.os.Handler
Instanz des Handlers wird gemacht
%Vor%Der letzte Schritt bei der Verwendung des Handlers ist die Verwendung der Runnable-Schnittstelle:
Alles zusammenfügen
%Vor%Wenn eine Anwendung gestartet wird, startet das Android-System einen Prozess mit einem Hauptthread, der für die Verarbeitung von UI-Rendering und Ereignissen zuständig ist. Die Android-Benutzeroberfläche ist nicht threadsicher, sodass wir nur auf die Android-Benutzeroberfläche zugreifen können. In Ihrem Programm haben Sie einen anderen Thread als das Ereignis definiert, indem Sie dem folgenden Codeblock folgen:
%Vor%Wenn Sie den Fortschrittsdialog jetzt schließen möchten, können Sie dies nur im Ereignisthread tun. Handler wird verwendet, um Nachrichten einer Nachrichtenwarteschlange zu bearbeiten / handhaben. Handler verbindet sich mit einem Thread, in Ihrem Fall mit einem Ereignis-Thread, da standardmäßig ein Thread zugeordnet wird, in dem er erstellt wird. von messageHandler.sendEmptyMessage () ein anderer Thread sendet eine Nachricht an den Handler und der Handler verarbeitet diese Nachricht in der Methode handleMessage.
Tags und Links android