2013-02-28 3 views
40

Ich frage mich, wenn ich handler.post(runnable); verwenden sollte und wann soll ich new Thread(runnable).start();Wann verwendet handler.post() & wenn neuen Thread()

Es wird erwähnt, in Entwickler-Dokumentation für Handler verwenden:

Bewirkt, dass Runnable r zur Nachrichtenwarteschlange hinzugefügt wird. Der runnable wird auf dem Thread ausgeführt, an dem dieser Handler angeschlossen ist.

Bedeutet dies, wenn ich in der onCreate() von Activity Klasse schreiben:

Handler handler = new Handler(); 
handler.post(runnable); 

dann runnable in einem separaten Thread oder im Thread Aktivität aufgerufen wird?

Antwort

64

Sie sollten Handler.post() immer dann verwenden, wenn Sie Operationen im UI-Thread ausführen möchten.

Nehmen wir an, in dem Callback (der in einem separaten Thread läuft) möchten Sie einen TextView Text ändern, sollten Sie Handler.post() verwenden.

In Android, wie in vielen anderen UI-Frameworks, können UI-Elemente (Widgets) nur vom Haupt-Thread geändert werden.


Edit: das Beispiel von langlaufende Aufgaben

mHandler = new Handler(); 

new Thread(new Runnable() { 
    @Override 
    public void run() { 
    // Perform long-running task here 
    // (like audio buffering). 
    // you may want to update some progress 
    // bar every second, so use handler: 
    mHandler.post(new Runnable() { 
    @Override 
    public void run() { 
     // make operation on UI - on example 
     // on progress bar. 
    } 
    }); 
    } 
}).start(); 

Natürlich, wenn die Aufgabe, die Sie ausführen möchten wirklich lang und es besteht die Gefahr, dass Benutzer einer anderen App wechseln könnte in In der Zwischenzeit sollten Sie eine Service verwenden.

+0

Aber wenn ich sage, möchte ich einen Audio-Stream aus dem Internet puffern. Soll ich es über handler.post oder neuen Thread machen? – reiley

+1

Kommt wirklich auf Ihre Anforderungen an. Ich würde entweder einen neuen Thread oder einen Service in Erwägung ziehen. Ich werde die Antwort mit Beispiel in einer Sekunde aktualisieren. – kamituel

11

Beispiel ist aufgebockt:

mHandler = new Handler(); 
new Thread(new Runnable(){ 
    @Override 
    public void run() { 
    mHandler.post(new Runnable() { 
    @Override 
    public void run() { 
     mUiView.setX(x); 
    } 
    }); 
    } 
}).start(); 

Alternativ können Sie die Handler überspringen und die Post-Methode auf der Ansicht verwenden, um direkt:

new Thread(new Runnable(){ 
    @Override 
    public void run() { 
    mUiView.post(new Runnable() { 
    @Override 
    public void run() { 
     mUiView.setX(x); 
    } 
    }); 
    } 
}).start(); 

Dies ist ein guter Beitrag, der den Unterschied skizziert: What exactly does the post method do?

18

Um Ihre spezifische Frage zu beantworten:

Bedeutet dies, wenn in der onCreate of Activity-Klasse ich schreibe:

Handler Handler = neuer Handler() hanlder.post (runnable); Runnable wird dann in einem separaten Thread oder im Thread der Activity aufgerufen?

Nein, wird es nicht sein. Das Runnable wird am Haupt-Thread selbst aufgerufen. Handler wird einfach verwendet, um eine Nachricht an den Thread zu senden, an den sie angehängt ist (wo sie erstellt wird). Es erstellt keinen eigenen Thread. In Ihrem Beispiel haben Sie einen Handler im Hauptthread erstellt (der Ort, an dem Activity.OnCreate() aufgerufen wird). Daher wird jede Nachricht, die auf einem solchen Handler bereitgestellt wird, nur auf dem Hauptthread ausgeführt.

+3

Richtige Antworten sind nicht immer die besten. Danke –

+0

Sie haben gerade die Perfs meiner App geändert !! Der Wechsel vom Handler zum Thread hat meine App einfach zum Fliegen gebracht! So groß danke Mann !! – Mitchapp

2

Verwendung handler.post() wenn Sie wollen Post der Code (in der Regel von Hintergrund-Thread) zum Hauptthread. Ja, POST, genau wie du, poste einen Brief an jemanden. Mit Hilfe von Handler wird der Code so schnell wie möglich ausgeführt.

Verwandte Themen