2012-12-20 12 views
75

Kann mir jemand sagen, ob es einen Unterschied zwischen der Verwendung von runOnUiThread() im Vergleich zu Looper.getMainLooper(). Post(), um eine Aufgabe auf dem UI-Thread in Android ??runOnUiThread vs Looper.getMainLooper(). Post in Android

Über das einzige, was ich feststellen kann ist, dass seit RunOnUiThread ist eine nicht-statische Activity-Methode, Looper.getMainLooper(). Post() ist bequemer, wenn Sie etwas in einer Klasse, die nicht sehen können Aktivität (z. B. eine Schnittstelle)

Ich bin nicht auf der Suche nach einer Diskussion darüber, ob etwas auf dem UIhread ausgeführt werden soll, bekomme ich, dass einige Dinge nicht können und eine Menge Dinge nicht, aber einige Dinge (wie das Starten einer AsyncTask) MUSS vom UI-Thread ausgeführt werden.

Danke,
R.

+4

Es gibt keinen Unterschied, außer dass 'runOnUiThread' prüft, ob es bereits der UI-Thread und Ihre Aufgabe direkt ausführen, anstatt sie als' Message' – zapl

+1

Dank der Entsendung. Würdest du das bitte in eine Antwort umwandeln, damit ich es annehmen kann ?? – Rich

+0

Außerdem habe ich bereits Code geschrieben, um zu überprüfen, ob etwas auf dem UI-Thread ausgeführt wird, so dass es sehr einfach wäre, es manuell einzubinden. – Rich

Antwort

149

Die folgende verhält sich das gleiche, wenn sie von Hintergrund-Threads genannt

über Looper.getMainLooper()

Runnable task = getTask(); 
    new Handler(Looper.getMainLooper()).post(task); 

über Activity#runOnUiThread()

Runnable task = getTask(); 
    runOnUiThread(task); 

Die einzige dif Konferenz ist, wenn Sie da

, dass aus dem UI-Thread tun
public final void runOnUiThread(Runnable action) { 
    if (Thread.currentThread() != mUiThread) { 
     mHandler.post(action); 
    } else { 
     action.run(); 
    } 
} 

prüfen, ob der aktuelle Thread ist bereits der UI-Thread und es dann direkt auszuführen. Wenn Sie es als Nachricht veröffentlichen, wird die Ausführung verzögert, bis Sie von der aktuellen UI-Thread-Methode zurückkehren.

Es gibt auch eine dritte Möglichkeit zum Ausführen einer Runnable auf dem UI-Thread, die wäre View#post(Runnable) - diese wird immer die Nachricht auch beim Aufruf aus dem UI-Thread. Das ist nützlich, da dies sicherstellen wird, dass die View ordnungsgemäß erstellt wurde und ein Layout hat, bevor der Code ausgeführt wird.

+2

Große Antwort, danke! – Boy

Verwandte Themen