С ES5 + (любой просматриваемый в настоящее время - 2017) вы должны иметь возможность делать
[].forEach.call(document.getElementsByClassName('answer'), function(el) {
el.style.color= 'red';
});
Нет никакой реальной разницы, кроме того, что View.post
полезна, когда вы не имеете прямого доступа к активности.
В обоих случаях, если не в потоке пользовательского интерфейса, Handler#post(Runnable)
будет вызываться за кулисами.
Поскольку CommonsWare упоминается в комментарии, есть разница между двумя - при вызове в потоке Ui, Activity#runOnUiThread
вызовет run
, а View#post
отправит runnable
в очередь (например, вызовите Handler#post
)
. Важным моментом IMO является то, что обе имеют одну и ту же цель, и для тех, кто ее использует, не должно быть разницы (и реализация может измениться в будущем).
Либо приемлемы для большинства ситуаций, и в большинстве случаев они взаимозаменяемы, но они являются тонко разными. Конечно, большая разница состоит в том, что один из них доступен из Activity
, а другой - с View
. Между ними много совпадений, но иногда в Activity
у вас не будет доступа к View
, а иногда в View
у вас не будет доступа к Activity
.
Один из краевых случаев, с которыми я столкнулся с View.post
, я упомянул в ответ на другой вопрос SO на View.post
: View.post
работает только из другого потока когда View
прикреплен к окну. Это редко бывает проблемой, но иногда может привести к тому, что Runnable
никогда не будет выполняться, особенно если вы вызываете View.post
в методе onCreate
вашего Activity
. Альтернативой является использование Handler.post
, что Activity
и View.post
используются в любом случае.
(отредактировано для точности, добавлено «от другого нить ")
onCreate()
? Hm, я ожидаю, что он опубликует в Handler
, предоставленный ViewRoot
в этом случае.
– Jens
11 May 2012 в 22:04
View.post
должен добавить Runnable
в очередь, которая будет выполнена позже, если она еще не установлена. Я не вырыл гораздо глубже в источнике, но docs действительно говорит: «Этот метод может быть вызван из-за потока пользовательского интерфейса только тогда, когда этот вид прикреплен к окну». Поэтому я думаю, что если он находится в текущем потоке, то то, что вы сказали, истинно, если это не так, возможно, он просто проглатывает Runnable
. Я, конечно, это произошло в моем коде.
– kabuko
11 May 2012 в 22:21
Другое различие между Activity.runOnUiThread и view.post () заключается в том, что runnable в view.post () вызывается после того, как представление прикреплено к окну.
runOnUiThread()
проверяет текущий поток и сразу же выполняетRunnable
, если мы попадаем в основной поток приложения.post()
всегда помещаетRunnable
в очередь, независимо от того, какой поток он вызвал. – CommonsWare 11 May 2012 в 22:21runOnUiThread()
проверяет текущий поток и немедленно выполняетRunnable
, если мы попадаем в основной поток приложений & quot; (выделено курсивом). «Означает ли это, что то, что когда-либо было в потоке пользовательского интерфейса, игнорируется, и это получает приоритет?» - "то, что когда-либо было в потоке пользовательского интерфейса" является i> вызовомrunOnUiThread()
. – CommonsWare 19 November 2012 в 15:42