Каковы все другие способы отправки объекта Runnable в MessageQueue MainThread? [Дубликат]

С ES5 + (любой просматриваемый в настоящее время - 2017) вы должны иметь возможность делать

[].forEach.call(document.getElementsByClassName('answer'), function(el) {
    el.style.color= 'red';
});

87
задан Alexander Kulyakhtin 11 May 2012 в 21:29
поделиться

3 ответа

Нет никакой реальной разницы, кроме того, что View.post полезна, когда вы не имеете прямого доступа к активности.

В обоих случаях, если не в потоке пользовательского интерфейса, Handler#post(Runnable) будет вызываться за кулисами.

Поскольку CommonsWare упоминается в комментарии, есть разница между двумя - при вызове в потоке Ui, Activity#runOnUiThread вызовет run, а View#post отправит runnable в очередь (например, вызовите Handler#post)

. Важным моментом IMO является то, что обе имеют одну и ту же цель, и для тех, кто ее использует, не должно быть разницы (и реализация может измениться в будущем).

93
ответ дан MByD 23 August 2018 в 00:38
поделиться
  • 1
    Одно отличие: runOnUiThread() проверяет текущий поток и сразу же выполняет Runnable, если мы попадаем в основной поток приложения. post() всегда помещает Runnable в очередь, независимо от того, какой поток он вызвал. – CommonsWare 11 May 2012 в 22:21
  • 2
    @CommonsWare - Правда, я отредактирую свой вопрос. – MByD 11 May 2012 в 22:22
  • 3
    Спасибо. Теперь я вижу разницу на основе вашего объяснения и комментария @CommonsWare. – Alexander Kulyakhtin 12 May 2012 в 09:40
  • 4
    @Ashwin: & quot; Вы сказали, что runOnUiThread () немедленно запускает Runnable & quot; -- нет, я не. Пожалуйста, перечитайте комментарий. Я сказал, что «runOnUiThread() проверяет текущий поток и немедленно выполняет Runnable , если мы попадаем в основной поток приложений & quot; (выделено курсивом). «Означает ли это, что то, что когда-либо было в потоке пользовательского интерфейса, игнорируется, и это получает приоритет?» - "то, что когда-либо было в потоке пользовательского интерфейса" является вызовом runOnUiThread(). – CommonsWare 19 November 2012 в 15:42
  • 5
    @ barn.gumbl: В этом случае я посмотрел на источник. – CommonsWare 17 September 2014 в 23:40
  • 6

Либо приемлемы для большинства ситуаций, и в большинстве случаев они взаимозаменяемы, но они являются тонко разными. Конечно, большая разница состоит в том, что один из них доступен из Activity, а другой - с View. Между ними много совпадений, но иногда в Activity у вас не будет доступа к View, а иногда в View у вас не будет доступа к Activity.

Один из краевых случаев, с которыми я столкнулся с View.post, я упомянул в ответ на другой вопрос SO на View.post : View.post работает только из другого потока когда View прикреплен к окну. Это редко бывает проблемой, но иногда может привести к тому, что Runnable никогда не будет выполняться, особенно если вы вызываете View.post в методе onCreate вашего Activity. Альтернативой является использование Handler.post , что Activity и View.post используются в любом случае.

(отредактировано для точности, добавлено «от другого нить ")

14
ответ дан Community 23 August 2018 в 00:38
поделиться
  • 1
    Он может выйти из строя, если не установлен в onCreate()? Hm, я ожидаю, что он опубликует в Handler, предоставленный ViewRoot в этом случае. – Jens 11 May 2012 в 22:04
  • 2
    @Jens Да, я взглянул на источник, и View.post должен добавить Runnable в очередь, которая будет выполнена позже, если она еще не установлена. Я не вырыл гораздо глубже в источнике, но docs действительно говорит: «Этот метод может быть вызван из-за потока пользовательского интерфейса только тогда, когда этот вид прикреплен к окну». Поэтому я думаю, что если он находится в текущем потоке, то то, что вы сказали, истинно, если это не так, возможно, он просто проглатывает Runnable. Я, конечно, это произошло в моем коде. – kabuko 11 May 2012 в 22:21
  • 3
    @kabuko Спасибо, ваш ответ показывает это с другой точки. Как это я не могу принять больше, чем 1 ответ не может видеть логику позади, которая будет адресовать мета форум – Alexander Kulyakhtin 12 May 2012 в 09:41
  • 4
    Это неправда. Это никогда не было правдой, но в какой-то момент JavaDoc для View.java ошибочно заявлял, что «View.post работает только из другого потока, когда вид прикреплен к окну». Это было исправлено 15 октября 2012 года, но потребовалось некоторое время, чтобы проникнуть в умы разработчиков Android. – Alex Cohn 26 June 2016 в 11:56

Другое различие между Activity.runOnUiThread и view.post () заключается в том, что runnable в view.post () вызывается после того, как представление прикреплено к окну.

18
ответ дан pareshgoel 23 August 2018 в 00:38
поделиться
  • 1
    Как вы показываете? Становится видимым? Не вызвали на невидимую точку зрения вообще? – Alexander Kulyakhtin 28 March 2014 в 18:23
  • 2
    Исправлена ​​двусмысленность Алекса. – pareshgoel 29 March 2014 в 11:35
  • 3
    Это самое важное различие ИМХО. Многие люди используют view.post () для выполнения материалов, которые необходимо выполнить ПОСЛЕ просмотра. – Sotti 14 February 2015 в 23:33
  • 4
    Это неправда. Это никогда не было правдой, но в какой-то момент JavaDoc для View.java ошибочно заявлял, что «View.post работает только из другого потока, когда вид прикреплен к окну». Это было исправлено 15 октября 2012 года, но потребовалось некоторое время, чтобы проникнуть в умы разработчиков Android. – Alex Cohn 26 June 2016 в 11:56
  • 5
    Источник @pareshgoel для этой разницы? – apostleofzion 11 July 2016 в 12:38
Другие вопросы по тегам:

Похожие вопросы: