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