2015-08-01 10 views
12

Kann mir jemand die Bedeutung zwischen Thread und Handler sagen? Wann benutzen wir Thread und wann benutzen wir Handler?Unterschied zwischen Thread und Handler

Ich habe zwei Code in meinem Projekt, aber ich kann sie nicht verstehen.

final Handler handler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     // Do SomeThings 
    } 
}; 

Und

private class readThread extends Thread 
{ 
    Handler mHandler; 

    readThread(Handler h){ 
     mHandler = h; 
     this.setPriority(Thread.MIN_PRIORITY); 

    } 

    @Override 
    public void run() 
    { 
     // Do SomeThings 
    } 
} 

Und in einem anderen Verfahren rufen Sie die Handler wie dies

read_thread = new readThread(handler); 
      read_thread.start(); 

Welchen Lauf ersten ?? Kann mir jemand das erklären?

+0

Sie verwenden nicht mHandler-Feld in readThread also wofür ist es? – pskink

+0

Ich weiß es nicht. Ich weiß nichts über diese Codes. Ich versuche sie unruhig zu machen – Khodayar

Antwort

21

Die gleiche: Sie beide Aufgabe asynchron Ihre aktuellen Code, ohne zu blockieren,

Der Unterschied ausführen kann: Stellen Sie sich vor Sie haben eine Runnable r = new Runnable{...}

  • Wenn Sie new Thread(r).start() verwenden, die Sie tatsächlich erstellt ein neuer Thread eine asynchrone Task ausführen.

  • Wenn Sie new Handler().post(r) (oder Message), kann du das Runnable Objekt Looper und den Code später in demselben Thread ausgeführt werden.

A Thread allgemein MainThread oder UIThread enthält eine Looper. Wenn MainThread ausgeführt wird, wird die Looper Schleife durchlaufen und Runnable einzeln ausgeführt.

Wenn Gewinde bevorzugt wird:

Wenn Sie eine schwere Arbeit wie die Netzwerkkommunikation tun, oder Dekodieren große Bitmap-Dateien, ein neuer Thread bevorzugt. Wenn viel Faden benötigt wird, ist vielleicht ExecutorService weiter bevorzugt. https://developer.android.com/reference/java/util/concurrent/ExecutorService.html

Wenn Handler bevorzugt wird:

Wenn Ihr wollen UI-Objekte aktualisieren (wie TextView ‚s Text) von anderen Thread, ist es notwendig, dass UI-Objekte nur in UI-Thread aktualisiert werden konnte. Wenn Sie später nur etwas Lichtcode ausführen möchten (wie Verzögerung für 300ms), können Sie Handler verwenden, weil es leichter und schneller ist.

Bitte siehe auch: Handler vs AsyncTask vs Thread

3

Themen allgemeine Verarbeitungsaufgaben sind die meisten Dinge tun können, aber eine Sache, die sie nicht tun können, ist die Benutzeroberfläche aktualisieren.

Handler auf der anderen Seite sind Hintergrundthreads, mit denen Sie mit dem UI-Thread kommunizieren können (Aktualisieren der Benutzeroberfläche).

So zum Beispiel zeigen Sie einen Toast oder ein Update eine Fortschrittsleiste über eine Nachricht (Runnable) an einen Handler gepostet, aber Sie können nicht, wenn Sie diese Runnable als Thread starten.

Mit Handler können Sie auch Dinge wie MessageQueuing, Planung und Wiederholung haben.

Ich bin noch eine Situation zu begegnen, wo ich einen Thread in Android brauchte.

Ich verwende meistens eine Kombination von AsyncTasks und Handlern.

Handler für die oben genannten Aufgaben.

AsyncTasks zum Download/Datenabruf und Abruf usw.

1

Thread tatsächlich schafft neuen Thread - Teil Job relativ zu aktuellem Thread im Hintergrund ausgeführt wird.

Handler selbst bietet keine Mechanismen für die Hintergrund-Job - es ist nur ein Werkzeug ist Message Queue (Looper) mit einem Thread zugeordnet zuzugreifen. UI-Thread hat Looper standardmäßig angeschlossen, so ist es gängige Praxis, UI mit Handler.post(Runable) zu aktualisieren, was bedeutet, dass ein Stück Code auf dem Thread ausgeführt wird, der diesem Handler zugeordnet ist.
Sobald HandlerLooper bedient, kann es nicht in einem Thread erstellt werden, dem kein Looper zugeordnet ist.