2012-05-11 13 views
81

Was ist der Unterschied zwischen Activity.runOnUiThread und View.post, könnte jemand, bitte, erklären?Android: Was ist der Unterschied zwischen Activity.runOnUiThread und View.post?

+0

ähnliche Fragen mit nützlichen Antworten: (http://stackoverflow.com/questions/4083787/runnable-is-posted-successfully-but-not-run) [Runnable ist erfolgreich, aber nicht ausgeführt geschrieben], [Was der Unterschied zwischen Activity.runOnUiThread (runnable action) und Handler.post()?] (http://stackoverflow.com/questions/1839625/whats-the-difference-between-activity-runonuithreadrunnable-action-and-handler), [Unterschied zwischen Handler.post (Runnable r) und Activity.runOnUiThread (Runnable r)] (http://stackoverflow.com/questions/7452884/difference-between-handler-postrunnable-r-and-activity-runonuithreadrunable) –

Antwort

90

Es gibt keinen wirklichen Unterschied, außer dass die View.post hilfreich ist, wenn Sie keinen direkten Zugriff auf die Aktivität haben.

In beiden Fällen, wenn nicht auf UI-Thread, Handler#post(Runnable) wird hinter den Kulissen aufgerufen werden.

Als CommonsWare im Kommentar erwähnt, gibt es einen Unterschied zwischen den beiden - wenn sie auf Ui Thread aufgerufen, Activity#runOnUiThread wird direkt die run Methode aufrufen, während View#post die runnable in der Warteschlange (zB rufen die Handler#post)

hinterlassen

Der wichtige Punkt IMO ist, dass beide das gleiche Ziel haben, und für alle, die es verwenden, sollte es keinen Unterschied geben (und die Implementierung kann sich in Zukunft ändern).

+59

Ein Unterschied: 'runOnUiThread()' prüft den aktuellen Thread und führt den 'Runnable' sofort aus, wenn wir uns im Hauptanwendungs-Thread befinden. 'post()' setzt immer das 'Runnable' in die Warteschlange, egal welchen Thread es aufgerufen hat. – CommonsWare

+0

@CommonsWare - True, ich werde meine Frage bearbeiten. – MByD

+0

Danke, ich kann jetzt den Unterschied anhand Ihrer Erklärung und des Kommentars von @CommonsWare sehen. –

14

Beide sind akzeptabel für die meisten Situationen und zum größten Teil sind sie austauschbar, aber sie sind subtil anders. Der größte Unterschied ist natürlich, dass man von einer Activity und die andere von einer View erhältlich ist. Es gibt eine Menge Überschneidungen zwischen diesen, aber manchmal in einem Activity haben Sie keinen Zugang zu einem View, und manchmal in einem View haben Sie keinen Zugang zu einem Activity.

einer der Rand Fällen I mit View.post angetroffen habe ich in an answer to another SO question on View.post erwähnt: View.post funktioniert nur von einem anderen Thread wenn die View an ein Fenster angebracht ist. Dies ist selten ein Problem, kann aber gelegentlich dazu führen, dass die Runnable nie ausgeführt wird, besonders wenn Sie View.post in der onCreate Methode Ihrer Activity aufrufen. Eine Alternative ist, Handler.post zu verwenden, die Activity.runOnUiThread und View.post sowieso unter den Abdeckungen verwenden.

(für Genauigkeit bearbeitet, hinzugefügt "von einem anderen Thread")

+1

Es kann fehlschlagen, wenn auch in 'onCreate()' nicht verbunden? Hm, ich würde erwarten, dass es in diesem Fall zum 'Handler' von' ViewRoot' gepostet wird. – Jens

+5

@Jens Ja, ich habe einen Blick auf die Quelle geworfen und 'View.post' sollte das' Runnable' zu ​​einer Warteschlange hinzufügen, die später ausgeführt wird, wenn sie noch nicht angehängt ist. Ich habe nicht viel tiefer in die Quelle gegraben, aber die [Docs] (http://developer.android.com/reference/android/view/View.html#post%28java.lang.Runnable%29) sagen: "Diese Methode kann nur außerhalb des UI-Threads aufgerufen werden, wenn diese Ansicht an ein Fenster angefügt ist." Also ich denke, wenn es auf dem aktuellen Thread ist, dann ist das, was du gesagt hast, wahr, wenn es nicht ist, dann schluckt es wahrscheinlich nur das 'Runnable'. Ich hatte das sicher in meinem Code. – kabuko

+0

@kabuko Danke deine Antwort zeigt es von einem anderen Punkt. Wie es ist, kann ich nicht akzeptieren mehr als 1 Antwort kann nicht Logik dahinter sehen, dass Adresse Meta-Forum –

16

Ein weiterer Unterschied zwischen Activity.runOnUiThread und view.post() ist, dass die in runnable view.post() aufgerufen wird, nachdem der Ansicht ist, an ein Fenster angehängt.

+0

Wie meinst du das gezeigt? Wird sichtbar? Nicht auf eine unsichtbare Sicht überhaupt aufgerufen? –

+0

Korrigierte die Mehrdeutigkeit Alex. – pareshgoel

+5

Dies ist der wichtigste Unterschied IMHO. Viele Leute benutzen view.post(), um Sachen auszuführen, die ausgeführt werden müssen, NACHDEM die Ansicht angehängt wurde. – Sotti

Verwandte Themen