Activity.runOnUiThread
和 View.post
有何区别?能否解释一下?
Activity.runOnUiThread
和 View.post
有何区别?能否解释一下?
两者实际上没有真正的区别,唯一不同的是当你无法直接访问活动时,View.post
会很有用。
在两种情况下,如果不在 UI 线程上,则会在后台调用Handler#post(Runnable)
。
正如 CommonsWare 在评论中提到的那样,两者之间存在差异 - 当在 Ui 线程上调用时,Activity#runOnUiThread
将直接调用 run
方法,而 View#post
将在队列上发布 runnable
(例如调用 Handler#post
)
我的重点在于,两者的目标相同,对于使用它的人来说,没有区别(并且实现将来可能会发生变化)。
runOnUiThread()
会检查当前线程,如果我们在主应用程序线程上运行,则立即执行 Runnable
。而 post()
则无论在哪个线程调用,始终会把 Runnable
放到队列中。 - CommonsWarerunOnUiThread()
会立即执行Runnable
”,不,我没有。请重新阅读评论。我说:“如果我们正在主应用程序线程上运行,'runOnUiThread()
将检查当前线程并立即执行Runnable
”(强调添加)。 “这是否意味着目前在UI线程上的任何内容都被忽略,而这个方法被优先考虑?”--“目前在UI线程上的任何内容”就是runOnUiThread()
方法的调用。 - CommonsWareActivity.runOnUiThread和view.post()之间的另一个区别是,view.post()中的runnable在视图附加到窗口后调用。
对于大多数情况来说,两者都可以接受,并且在很大程度上它们是可以互换的,但它们仍然存在细微的差别。当然最大的区别是其中一个可从 Activity
获取,而另一个则可从 View
获取。这两者之间有很多重叠,但有时在 Activity
中你将无法访问到 View
,而有时在 View
中你将无法访问到 Activity
。
我曾经遇到过一个边缘情况,就是针对 View.post
,我在另一个关于View.post
的SO问题回答中提到:只有当 View
附加到窗口时,View.post
才能在 另一个线程 中正常工作。这通常不会成为问题,但有时可能会导致 Runnable
永远不会被执行,特别是如果你在 Activity
的 onCreate
方法中调用了 View.post
。一个替代方案是使用 Handler.post
,这正是 Activity.runOnUiThread
和 View.post
内部使用的。
(因准确性而编辑,添加了“从另一个线程”)
onCreate()
中,它也可能会失败吗?嗯,我期望它在这种情况下会发布到由 ViewRoot
提供的 Handler
。 - JensRunnable
尚未附加,则View.post
应将其添加到队列中以稍后执行。 我没有深入研究源代码,但文档确实说:“当此视图附加到窗口时,仅当在UI线程外部调用此方法。” 因此,我认为如果在当前线程上,那么您所说的是正确的,如果不是,它可能会忽略Runnable
。 我的代码中肯定发生过这种情况。 - kabukopost
是每个视图;runOnUiThread
是每个活动。view.getQueue
/ activity.getQueue
,并且可以精确地获取您想要的内容,而无需自己编写跟踪或过滤代码。