Warum Handler benutzen?

8

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 ???

%Vor%     
Syamantak Basu 07.09.2012, 06:34
quelle

4 Antworten

17

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 neues Handler 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.

    
Dheeraj V.S. 07.09.2012, 06:43
quelle
29

Warum Handler in Android verwenden?

Zuerst: Lassen Sie uns wissen, was Thread ist:

  • Threads helfen beim Multitasking
  • Threads können als Mini-Prozess gelehrt werden, der unter einem Hauptprozess läuft
  • Threads ermöglichen zumindest die parallele Darstellung der Darstellung

Zweitens: Lassen Sie uns den Anwendungsthread wissen: -

  • Wenn die Android-Anwendung gestartet wird, erstellt das Laufzeitsystem einen einzelnen Hauptthread, dieser Hauptthread kümmert sich um die Ausführung aller Komponenten in android

Android UI-Toolkit ist nicht threadsicher

  • Wie bereits erwähnt, gibt es viele Komponenten im Android-Hauptthread. Nehmen wir nun an, dass eine der Komponenten eine lange Zeit für die Ausführung benötigt Dadurch wird der Hauptthread nicht mehr reagiert und wird angezeigt Anwendung reagiert nicht mehr
  • Sub-Threads können den (Haupt-) Thread der Anwendung nicht direkt manipulieren im Android
  • Handler fungiert als Schnittstelle und sammelt die Nachrichten von der Sub-Threads und aktualisieren Sie den Hauptanwendungs-Thread nacheinander als Nachrichten ankommen, Thread-Handler sind im Haupt-Thread implementiert.

Handler-Klasse:

  • Zum Multithreading werden wir die Handler-Klasse verwenden, die kommt aus dem Paket android.os.Handler
  • Jeder Thread wird von einer Instanz der Handler-Klasse
  • behandelt

  • Aus der obigen Abbildung können wir sehen, dass Jeder Thread von einem behandelt wird Instanz der Handler-Klasse
  • Threads kommunizieren untereinander mit Hilfe von Nachrichten
  • Diese Handler-Klasse hilft dabei, Art der Sync-Koordination s / w zu pflegen Threads, indem sie es ihnen erlauben, zusammen zu laufen und Multithreading zu erreichen

Instanz des Handlers wird gemacht

%Vor%

Der letzte Schritt bei der Verwendung des Handlers ist die Verwendung der Runnable-Schnittstelle:

    Die Handlerklasse
  • verwendet eine runnable-Schnittstelle zum Implementieren von Multithreading
  • Wir überschreiben die run-Methode, um einen Thread eine bestimmte Anzahl von Malen auszuführen
%Vor%

Alles zusammenfügen

%Vor%     
Devrath 15.08.2013 04:03
quelle
4

Je einfacher, desto besser. Anstatt einen Handler zu verwenden, könnten Sie versuchen, den folgenden Code zu verwenden:

%Vor%

Mach dein Leben nicht zu kompliziert;)

    
Marek 16.08.2013 05:09
quelle
2

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.

    
jeet 07.09.2012 06:45
quelle

Tags und Links