Activity.runOnUiThread
和之间有什么区别View.post
,有人可以解释一下吗?
4 回答
没有真正的区别,只是View.post
当您无法直接访问活动时它很有帮助。
在这两种情况下,如果不在 UI 线程上,Handler#post(Runnable)
将在幕后调用。
正如评论中提到的 CommonsWare 一样,两者之间存在区别 - 在 Ui 线程上调用时,Activity#runOnUiThread
将直接调用该run
方法,而View#post
将 发布runnable
到队列中(例如调用Handler#post
)
重要的一点 IMO 是两者都有相同的目标,对于使用它的人来说,应该没有区别(并且未来的实现可能会改变)。
Activity.runOnUiThread 和 view.post() 的另一个区别是 view.post() 中的可运行对象是在视图附加到窗口后调用的。
在大多数情况下,两者都是可以接受的,并且在大多数情况下它们是可以互换的,但它们有细微的不同。当然,最大的区别是一个可从 an 获得Activity
,另一个可从 a 获得View
。它们之间有很多重叠,但有时在 an 中Activity
您将无法访问 a View
,有时在 a 中View
您将无法访问Activity
.
我在对另一个 SO 问题的回答中View.post
提到了我遇到的一个边缘情况:仅当附加到窗口时才从另一个线程工作。这很少会成为问题,但偶尔会导致永远不会执行,尤其是当您调用. 另一种方法是使用which is what并在幕后使用。View.post
View.post
View
Runnable
View.post
onCreate
Activity
Handler.post
Activity.runOnUiThread
View.post
(为准确性而编辑,添加“来自另一个线程”)
另一个区别:post
是每个视图;runOnUiThread
是每个活动。
This means it will be possible (in the future?) to do view.getQueue
/ activity.getQueue
and get exactly what you want without your own tracking or filtering code.