Android:Activity.runOnUiThread和View.post有什么区别?

Ale*_*tin 92 android

有什么区别Activity.runOnUiThreadView.post,有人可以解释一下吗?

MBy*_*ByD 100

没有真正的区别,只有View.post当您无法直接访问活动时,这会有所帮助.

在这两种情况下,如果不在UI线程上,Handler#post(Runnable)将在幕后调用.

正如CommonsWare在评论中提到的那样,两者之间存在差异 - 当在Ui线程上Activity#runOnUiThread调用时,将run直接调用该方法,而View#postrunnable在队列上发布(例如调用Handler#post)

IMO的重点是两者都有相同的目标,对于任何使用它的人来说,应该没有区别(并且实施可能会在未来发生变化).

  • 一个区别:`runOnUiThread()`检查当前线程并立即执行`Runnable`如果我们碰巧在主应用程序线程上.`post()`总是将`Runnable`放在队列中,无论调用什么线程. (66认同)
  • @Ashwin:"你说runOnUiThread()立即执行Runnable" - 不,我没有.请重新阅读评论.我说"`runOnUiThread()`检查当前线程并立即执行`Runnable`**如果我们碰巧在主应用程序线程上**"(强调添加)."这是否意味着当前在UI线程上的内容被忽略,这是第一优先权?" - "当前UI线程上的内容"*是*runOnUiThread()`调用. (3认同)
  • 它们是有区别的。发布到未附加到窗口的视图不会做任何事情。尽管不是*巨大的*差异,但这可能会导致细微的错误,并且如果您不知道存在差异,则导航会非常烦人。 (2认同)

par*_*oel 23

Activity.runOnUiThread和view.post()之间的另一个区别是视图附加到窗口后调用view.post()中的runnable.

  • 这是恕我直言最重要的区别.很多人使用view.post()来执行附加视图后需要执行的东西. (5认同)
  • 这不是真的。这从来都不是真的,但是在某些时候,View.java的JavaDoc确实错误地指出“当将View连接到窗口时,View.post仅可从另一个线程运行”。该问题已于2012年10月15日[修复](https://github.com/android/platform_frameworks_base/commit/edc900528937cd03f0d3a94fdf73d019324a2054),但花了一些时间才能渗透到Android开发人员的脑海中。 (3认同)

kab*_*uko 17

无论是在大多数情况下和用于它们是可互换的大部分上可接受的,但它们微妙的不同.最大的区别当然是一个可以从一个Activity和另一个可用View.这些之间有很多重叠,但有时候Activity你将无法访问a View,有时候View你将无法访问Activity.

View.post我在回答另一个SO问题时View.post遇到过的一个边缘情况:View.post只有在连接到窗口时才能从另一个线程开始工作View.这很少是一个问题,但偶尔会导致Runnable永远不会执行,特别是如果你调用你View.postonCreate方法Activity.另一种方法是使用Handler.post哪种是什么,Activity.runOnUiThreadView.post在封面下使用.

(编辑准确性,"从另一个线程"添加)

  • @Jens是的,我已经浏览了源代码,并且`View.post`应该将`Runnable`添加到队列中,如果它还没有附加,则稍后执行.我没有深入挖掘源代码,但[docs](http://developer.android.com/reference/android/view/View.html#post%28java.lang.Runnable%29)确实说: "只有当此视图附加到窗口时,才能从UI线程外部调用此方法." 所以我认为如果它在当前的线程中,那么你说的是真的,如果不是那么它可能只是吞下了'Runnable`.我当然在我的代码中发生了这种情况. (5认同)
  • 这不是真的.这从来都不是真的,但是在某些时候,View.java的JavaDoc错误地声明"当View附加到窗口时,View.post只能从另一个线程工作".这是[修复](https://github.com/android/platform_frameworks_base/commit/edc900528937cd03f0d3a94fdf73d019324a2054)于2012年10月15日,但需要一段时间才能渗透到Android开发人员的脑海中. (3认同)