Was ist der Unterschied zwischen Activity.runOnUiThreadund View.post, könnte jemand bitte erklären?
Was ist der Unterschied zwischen Activity.runOnUiThreadund View.post, könnte jemand bitte erklären?
Antworten:
Es gibt keinen wirklichen Unterschied, außer dass dies View.posthilfreich ist, wenn Sie keinen direkten Zugriff auf die Aktivität haben.
In beiden Fällen wird, wenn nicht im UI-Thread, Handler#post(Runnable)hinter den Kulissen aufgerufen.
Wie CommonsWare im Kommentar erwähnt, gibt es einen Unterschied zwischen den beiden - wenn es im Ui-Thread aufgerufen wird, Activity#runOnUiThreadwird die runMethode direkt aufgerufen , während View#postdie runnablein der Warteschlange veröffentlicht wird (z. B. call the Handler#post).
Der wichtige Punkt IMO ist, dass beide das gleiche Ziel haben, und für jeden, der es verwendet, sollte es keinen Unterschied geben (und die Implementierung kann sich in Zukunft ändern).
runOnUiThread()Überprüft den aktuellen Thread und führt den Runnablesofort aus, wenn wir uns zufällig im Hauptanwendungsthread befinden. post()stellt das immer Runnablein die Warteschlange, egal welcher Thread aufgerufen wird.
runOnUiThread()Überprüft den aktuellen Thread und führt den Runnablesofort aus, wenn wir uns zufällig im Hauptanwendungsthread befinden " (Hervorhebung hinzugefügt). "Bedeutet das, dass alles, was sich gerade im UI-Thread befindet, ignoriert wird und dies erste Priorität erhält?" - "Was auch immer aktuell im UI-Thread ist" ist der runOnUiThread()Aufruf.
Ein weiterer Unterschied zwischen Activity.runOnUiThread und view.post () besteht darin, dass die ausführbare Datei in view.post () aufgerufen wird, nachdem die Ansicht an ein Fenster angehängt wurde.
Entweder sind akzeptabel für die meisten Situationen und zum größten Teil sie austauschbar sind, aber sie sind auf subtile Weise anders. Der größte Unterschied ist natürlich, dass einer von einem Activityund der andere von einem erhältlich ist View. Es gibt viele Überschneidungen zwischen diesen, aber manchmal haben Sie in einem Activitykeinen Zugriff auf ein View, und manchmal haben Sie in einem Viewkeinen Zugriff auf ein Activity.
Einer der Randfälle, auf die ich gestoßen View.postbin, wurde in einer Antwort auf eine andere SO-Frage erwähntView.post : Funktioniert View.postnur von einem anderen Thread aus, wenn der Viewan ein Fenster angehängt ist. Dies ist selten ein Problem, kann jedoch gelegentlich dazu Runnableführen, dass das Programm nie ausgeführt wird, insbesondere wenn Sie View.postdie onCreateMethode Ihres aufrufen Activity. Eine Alternative ist zu verwenden, Handler.postwas was ist Activity.runOnUiThreadund View.postunter der Decke zu verwenden.
(aus Genauigkeitsgründen bearbeitet, "aus einem anderen Thread" hinzugefügt)
onCreate()es nicht angeschlossen ist? Hm, ich würde erwarten, dass es in diesem Fall an die von Handlergeliefert ViewRootwird.
View.postsollte die Runnablezu einer Warteschlange hinzufügen, die später ausgeführt werden soll, wenn sie noch nicht angehängt ist. Ich habe nicht viel tiefer in die Quelle gegraben, aber die Dokumente sagen: "Diese Methode kann nur von außerhalb des UI-Threads aufgerufen werden, wenn diese Ansicht an ein Fenster angehängt 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 habe das sicherlich in meinem Code erlebt.