postInvalidate() 有啥作用?
Posted
技术标签:
【中文标题】postInvalidate() 有啥作用?【英文标题】:What does postInvalidate() do?postInvalidate() 有什么作用? 【发布时间】:2011-07-28 03:42:27 【问题描述】:android中postInvalidate()
函数有什么用?我在很多地方都看到过这个功能。当我用 Google 搜索时,我得到了这么多:
postInvalidate-- 在 UI 线程上发布一个无效请求
我不知道那里的“无效请求”是什么意思。有人可以详细解释这里发生了什么吗?
【问题讨论】:
【参考方案1】:从 View 类派生的每个类都有 invalidate 和 postInvalidate 方法。如果 invalidate 被调用,它会告诉系统当前视图已经改变,应该尽快重绘。由于此方法只能从您的 UIThread 调用,当您不在 UIThread 中并且仍想通知系统您的视图已更改时,需要另一个方法。 postInvalidate 方法从非 UIThread 通知系统,视图会尽快在 UIThread 的下一个事件循环中重绘。在 SDK 文档中也是 briefly explained。
只需比较 invalidate 和 postInvalidate。
【讨论】:
感谢您的回答。我现在知道了。 我在您的回答中看到了逻辑,但 invalidate() 也适用于我的非 UI 类。和 postInvalidate() 一样好用。 很好的答案。 Android 文档没有解释它意味着重绘视图。立即清除它:) 正如@Sebastian 提到的,我还尝试了非UI 线程中的invalidate()
和postInvalidate()
(使用Executors.newSingleThreadExecutor()
),但它们都工作正常,至少似乎没有问题.有谁知道为什么?【参考方案2】:
通过这种方法 (postInvalidate()
),您可以使来自非 UI 线程的 View
无效。要使 UI 线程中的 View
无效,请使用 invalidate()
方法。
失效意味着,View.onDraw(Canvas)
方法将在未来某个时间点(不是立即)调用以重绘整个View
(如果View
可见)。
Android 正在自动重绘View
s,但有时需要告诉:“嘿,这个View
已更改,尽快重绘它。”
更多信息:
http://developer.android.com/guide/topics/ui/how-android-draws.html
http://developer.android.com/reference/android/view/View.html#invalidate%28%29
【讨论】:
【参考方案3】:简单来说,invalidate()
方法可以从 UI 线程调用,postInvalidate()
可以从非 UI 线程调用,以便告诉 android 在对其进行一些更改后更新我们的自定义视图。
【讨论】:
以上是关于postInvalidate() 有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章
安卓invalidate和requestLayout还有postInvalidate的区别
invalidate和postInvalidate 的区别及使用
requestLayout invalidate postInvalidate
安卓invalidate和requestLayout还有postInvalidate的区别