В чем разница между Activity.runOnUiThreadи View.post, может кто-нибудь объяснить?
В чем разница между Activity.runOnUiThreadи View.post, может кто-нибудь объяснить?
Ответы:
Нет никакой реальной разницы, кроме View.post это полезно, когда у вас нет прямого доступа к активности.
В обоих случаях, если не в потоке пользовательского интерфейса, Handler#post(Runnable) будет вызываться за кулисами.
Как упоминалось в комментарии CommonsWare, между ними есть разница - при вызове в потоке пользовательского интерфейса Activity#runOnUiThreadвызовет runметод напрямую, в то время как View#postотправит его runnableв очередь (например, вызовет Handler#post)
Важным моментом IMO является то, что оба имеют одну и ту же цель, и для тех, кто ее использует, не должно быть никакой разницы (и реализация может измениться в будущем).
runOnUiThread()проверяет текущий поток и Runnableнемедленно выполняет, если мы оказались в основном потоке приложения. post()всегда помещает в Runnableочередь, независимо от того, в каком потоке он вызван.
runOnUiThread()проверяет текущий поток и Runnableнемедленно выполняет его, если мы оказались в основном потоке приложения » (выделено мной). «Означает ли это, что все, что в данный момент находится в потоке пользовательского интерфейса, игнорируется, и этому предоставляется первый приоритет?» - «все, что в данный момент находится в потоке пользовательского интерфейса» - это runOnUiThread()вызов.
Еще одно различие между Activity.runOnUiThread и view.post () заключается в том, что runnable в view.post () вызывается после того, как представление прикреплено к окну.
Либо являются приемлемыми для большинства ситуаций и по большей части они являются взаимозаменяемыми, но они являются тонко разные. Самая большая разница, конечно, в том, что один доступен из файла, Activityа другой из View. Там очень много перекрытия между тем, но иногда в Activityне будет иметь доступ к View, а иногда и в Viewвас не будет иметь доступ кActivity .
Один из крайних случаев, с которыми я столкнулся, View.postя упомянул в ответе на другой вопрос SOView.post : View.postработает только из другого потока, когда Viewон прикреплен к окну. Это редко проблема, но иногда может привести к тому, Runnableчтобы никогда не выполнить, особенно , если вы звоните View.postв onCreateметоде из ваших Activity. Альтернатива - использовать то, Handler.postчто есть, Activity.runOnUiThreadи View.postв любом случае использовать под одеялом.
(отредактировано для точности, добавлено «из другой ветки»)
onCreate()? Хм, я бы ожидал, что в этом случае он будет отправлен на адрес Handlerпоставщика ViewRoot.
View.postдолжен добавить Runnableего в очередь для выполнения позже, если он еще не прикреплен. Я не копался глубже в исходном коде, но в документации действительно говорится: «Этот метод может быть вызван извне потока пользовательского интерфейса, только когда это представление прикреплено к окну». Поэтому я думаю, что если он находится в текущем потоке, то то, что вы сказали, верно, если это не так, то, вероятно, он просто проглатывает Runnable. В моем коде это наверняка случалось.