Activity.runOnUiThread和之间有什么区别View.post,请问有人可以解释吗?
Activity.runOnUiThread和之间有什么区别View.post,请问有人可以解释吗?
Answers:
没有真正的区别,除了View.post在您无法直接访问活动时会有所帮助。
在这两种情况下,如果不在UI线程上,Handler#post(Runnable)都将在后台调用。
如评论中提到的CommonsWare所述,两者之间是有区别的-在Ui线程上Activity#runOnUiThread调用时,将run直接调用该方法,而View#post将其发布runnable到队列中(例如调用Handler#post)
IMO的重点是两者都有相同的目标,对于使用该目标的人来说,应该没有区别(并且将来的实现可能会发生变化)。
runOnUiThread()检查当前线程,Runnable如果碰巧在主应用程序线程上,则立即执行。无论调用什么线程,post()总是将其Runnable放在队列中。
runOnUiThread()检查当前线程并Runnable立即执行”(强调)。“这是否意味着将忽略UI线程上的当前内容,并且将其放在首位?” - “什么都目前在UI线程” 是的电话。runOnUiThread()
Activity.runOnUiThread和view.post()之间的另一个区别是,在将视图附加到窗口之后调用view.post()中的runnable。
对于大多数情况而言,这两种方法都是可以接受的,并且在大多数情况下它们是可以互换的,但是它们之间存在细微的差异。当然,最大的区别是一个可以从那里获得Activity,另一个可以从那里获得View。两者之间有很多重叠之处,但有时在中Activity您将无法访问View,而有时在中View您将无法访问Activity。
我遇到的一些极端情况是在另一个SO问题的答案中View.post提到的View.post:View.post仅当将附加到窗口时,才能从另一个线程工作View。这很少有问题,但有时可能导致Runnable永不执行,特别是如果您View.post使用的onCreate方法调用Activity。另一种方法是使用Handler.post这就是Activity.runOnUiThread和View.post使用被窝里呢。
(出于准确性进行了编辑,“从另一个线程添加”)
onCreate()也会失败吗?嗯,在这种情况下,我希望它可以发布到Handler提供的内容ViewRoot。