我见过代码示例,其中Runnable被发布到UI线程,我们可能已经在主UI线程上执行了。例如,here最佳答案建议发布可运行的。我知道这意味着runnable将在消息队列的末尾发布,但我不确定在从UI线程本身发布它的上下文中意味着什么。
似乎任何东西都可以作为一个可运行的发布,所以我们怎么知道什么时候必须发布?推荐或需要练习的情况是什么?
答案 0 :(得分:2)
最重要的是,通过发布runnable
,您可以等待排队的UI更改完成,以便更新视图并使其处于空闲状态。
案例1 :您正试图在某些时候访问部分视图,例如。您想要onCreate()
中的布局大小,视图已初始化但未测量或绘制。在这种情况下,您希望在绘制视图并准备好时执行代码。通过在UI线程上发布runnable
,您将延迟执行代码,直到该视图被绘制并准备就绪。
案例2:
Android中的许多API
次调用会导致view/layout
更改并重新绘制。例如。调用notifyDataSetChanged()
将重绘列表项。 Android不会立即绘制它,而是等待UI线程空闲(有些像在UI线程上发布runnable)。在这种情况下,如果您调用method A
对列表执行某些操作,则返回的值可能不准确,因为尚未绘制更改的视图或布局。在这种情况下,您发布一个runnable
,它在UI队列完成后执行(这基本上意味着已经绘制了已更改的视图)
答案 1 :(得分:1)
发布到UI线程的唯一时间 required 是需要更改UI元素并且代码尚未在UI线程上执行的时候(正如您最有可能实现的那样)。除此之外,它只是与可能已发布到消息队列或依赖布局或失效生效的其他UI事件的时序问题。在您关联的示例中,对notifyDataSetChanged()
的调用将导致ListView
的UI更改在下一个布局之前不会生效,并且通过AdapterView.AdapterDataSetObserver.onChanged()
调用requestLayout()
。发布命令以转到列表底部可确保在请求的布局和生成的UI更改完成之后,命令不会执行。