2012-05-23 16 views
10

In Android kann Handler verwendet werden, um Nachricht zu posten/zu behandeln, wenn ich kein HandlerThread verwende (übergeben Sie seinen Looper an Handler), bedeutet das in diesem Fall Handler MainThread (UI Thread) verwenden Looper?Warum HandlerThread in Android verwenden

Welches Ergebnis wird erhalten, wenn Handler MainThread Looper verwendet? Kann mainThread blockiert werden?

Antwort

4

Wie Doc sagt:

Handy-Klasse für einen neuen Thread starten, die einen Greifer aufweist.
Der Looper kann dann verwendet werden, um Handler-Klassen zu erstellen.
Beachten Sie, dass start() noch aufgerufen werden muss.

HanderThread Klasse erbt von der Thread-Klasse, die die Looper Objekt kapselt, so dass wir die Looper offen und lassen Sie Details nicht kümmern. Wie bei normalem Thread müssen wir Looper.prepare() und Looper.loop() verwenden, um es als LooperThread zu konvertieren.

4

Normalweg HandlerThread wie folgt zu verwenden:

HandlerThread thread = new HandlerThread("A Handler Thread"); 
thread.start(); 
Handler handler = new Handler(thread.getLooper()){ 
    @Override 
    public void handleMessage(Message msg) 
    { 
    //.... 
    } 
}; 

Da HandlerThread ein Looper für Handler erstellen kann, ist es eine Art bequeme Weise.

Wenn Sie einen neuen Handler erstellen, wird es an den Thread/Nachrichtenwarteschlange des Threads gebunden, die es schafft - offizielle Dokumentation sehen ...

+0

Dies ist die offizielle Dokumentation. 'Handliche Klasse zum Starten eines neuen Threads mit einem Looper. Der Looper kann dann zum Erstellen von Handler-Klassen verwendet werden. Beachten Sie, dass start() immer noch aufgerufen werden muss. 'Ich habe deine Zeit gespart. – UnKnown

10

Sie HandlerThread in Fall verwenden würde, die Sie ausführen möchten Hintergrund Aufgaben nacheinander und Sie möchten, dass diese Aufgaben in der Reihenfolge der Ausführung ausgeführt werden.

Zum Beispiel, wenn Sie mehrere Netzwerk-Hintergrundoperationen nacheinander durchführen möchten.

Ja, der HandlerThread verfügt über einen eigenen Looper und es können Handler erstellt und gepostet werden (damit der Hauptthread nicht blockiert wird).

0

HandlerThread ist nützlich, wenn Sie viele Hintergrundaufgaben ausführen möchten, da es einen eigenen Looper hat. Wenn Sie eine Nachricht an einen Handler senden, wird normalerweise der Looper des MainThreads verwendet. Dies bedeutet, dass die Aufgabe auf dem UI-Thread ausgeführt wird. Im Fall von HandlerThread werden diese Aufgaben jedoch im Worker-Thread ausgeführt. Sie können eine ausführlichere Erklärung here

2

finden, wenn ich (mit seinem Looper zu Handler) keine HandlerThread verwenden, dass in diesem Fall Handler bedeutet verwenden Mainthread (UI Thread) ‚s Looper?

Hier finden Sie aktuelle Dokumentation von Handler

Handler() 

Standardkonstruktors verbindet diesen Handler mit dem Looper für den aktuellen Thread.

Wenn Ihr aktueller Thread MainThread ist, verwendet er MainThread (UI Thread) Looper.

Um Handler explizit mit Ihrem MainThread (UI-Thread) zu verknüpfen, schreiben Sie den folgenden Code.

Handler mHandler = new Handler(Looper.getMainLooper(); 

Wenn Sie schreiben, wie unten ist, verwendet es HandlerThread Looper.

HandlerThread handlerThread = new HandlerThread("HandlerThread"); 
handlerThread.start(); 
Handler requestHandler = new Handler(handlerThread.getLooper()); 

Wenn Sie Netzwerk-IO haben in Runnable Aufgabe, können Sie nicht Haupt-Thread Looper verwenden. In diesem Fall ist HandlerThread nützlich, um die Aufgabe Runnable zu verschicken, die den Netzwerk-IO-Betrieb durchführt.

Sie können Beispielcode @How do I fix android.os.NetworkOnMainThreadException?

Wie weit kommt, wenn Handler verwendet Mainthread Loopers finden? Kann mainThread blockiert werden?

Wenn Sie viele Ereignisse an MainThread Looper senden, werden sie auf MainThread (UI-Thread) selbst ausgeführt. Wenn die übermittelten Aufgaben mehr Zeit für die Ausführung benötigen, wird MainThread blockiert.

prüfen unten Beitrag für Interna von Looper:

What is the purpose of Looper and how to use it?