Android 何时建议从UI线程本身发布到UI线程?

Android 何时建议从UI线程本身发布到UI线程?,android,Android,我看到过一些代码示例,其中一个Runnable被发布到UI线程,我们可能已经在主UI线程上执行了。例如,上面的答案建议发布runnable。我理解这意味着runnable将被发布在消息队列的末尾,但我不确定从UI线程本身发布它的上下文中这意味着什么 似乎任何东西都可以发布为runnable,那么我们如何知道何时必须发布?在哪些情况下建议或要求进行此操作 唯一需要发布到UI线程的时间是当需要更改UI元素并且代码尚未在UI线程上执行时(您很可能已经意识到)。除此之外,这只是一个时间问题,其他UI事件

我看到过一些代码示例,其中一个Runnable被发布到UI线程,我们可能已经在主UI线程上执行了。例如,上面的答案建议发布runnable。我理解这意味着runnable将被发布在消息队列的末尾,但我不确定从UI线程本身发布它的上下文中这意味着什么


似乎任何东西都可以发布为runnable,那么我们如何知道何时必须发布?在哪些情况下建议或要求进行此操作

唯一需要发布到UI线程的时间是当需要更改UI元素并且代码尚未在UI线程上执行时(您很可能已经意识到)。除此之外,这只是一个时间问题,其他UI事件可能已发布到消息队列或依赖布局或失效生效。在链接到的示例中,对
notifyDataSetChanged()
的调用将导致
列表视图的UI更改,直到下一个布局时才会生效,并且通过
AdapterView.AdapterDataSetObserver.onChanged()
,调用
requestLayout()
。将命令发布到列表底部可确保在请求的布局和结果UI更改完成之前不会执行该命令。

底线是,通过发布
runnable
,您可以等待队列UI更改完成,以便更新视图并使其处于空闲状态

案例1:您试图在视图不可用的某个点访问视图的某些部分,例如,您想要在
onCreate()
中获得布局的大小,视图已初始化,但未测量或绘制。在这种情况下,您希望在绘制视图并准备就绪时执行代码。通过在UI线程上发布一个
runnable
,您将延迟代码的执行,直到绘制并准备好该视图

案例2:
Android中的许多
API
调用导致
view/layout
更改和重画。例如,调用
notifyDataSetChanged()
将重新绘制列表项。Android不会立即绘制它,而是等待UI线程空闲(比如在UI线程上发布runnable)。在这种情况下,如果调用对列表执行某些操作的
方法A
,则返回的值可能不准确,因为更改的视图尚未绘制或布局。在这种情况下,您发布一个
可运行的
,它在UI队列完成后执行(这基本上意味着已绘制更改的视图)

,这意味着(对我来说)来自notifyDataSetChanged的一些UI更改是postDelayed(),我们可能会导致问题(或者至少无法获得我们期望的顺序)通过在主线程上立即执行。这是正确的想法吗?为了正确起见,我们应该总是发布任何更新UI的内容吗?我现在略读了一下源代码,实际上没有发布任何内容。我将很快更新我的答案,使之更加准确,但总体思路是一样的,因为这是一个时间问题。如果UI操作的顺序很重要,那么使用post机制通常是合理的。答案很好-如果我没记错的话,我遇到过案例1中使用post的情况,即有时视图的高度仍然会返回0,而我不得不使用ViewTreeObserver。