102

Activity.runOnUiThread和之间有什么区别View.post,有人可以解释一下吗?

4

4 回答 4

109

没有真正的区别,只是View.post当您无法直接访问活动时它很有帮助。

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

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

重要的一点 IMO 是两者都有相同的目标,对于使用它的人来说,应该没有区别(并且未来的实现可能会改变)。

于 2012-05-11T20:31:59.857 回答
23

Activity.runOnUiThread 和 view.post() 的另一个区别是 view.post() 中的可运行对象是在视图附加到窗口后调用的。

于 2014-03-28T11:19:44.870 回答
17

在大多数情况下,两者都是可以接受的,并且在大多数情况下它们是可以互换的,但它们细微的不同。当然,最大的区别是一个可从 an 获得Activity,另一个可从 a 获得View。它们之间有很多重叠,但有时在 an 中Activity您将无法访问 a View,有时在 a 中View您将无法访问Activity.

我在对另一个 SO 问题的回答中View.post提到了我遇到的一个边缘情况:仅当附加到窗口时才从另一个线程工作。这很少会成为问题,但偶尔会导致永远不会执行,尤其是当您调用. 另一种方法是使用which is what并在幕后使用。View.postView.postViewRunnableView.postonCreateActivityHandler.postActivity.runOnUiThreadView.post

(为准确性而编辑,添加“来自另一个线程”)

于 2012-05-11T20:58:52.517 回答
0

另一个区别: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.

于 2020-05-10T14:48:53.030 回答