postInvalidate() 有啥作用?

Posted

技术标签:

【中文标题】postInvalidate() 有啥作用?【英文标题】:What does postInvalidate() do?postInvalidate() 有什么作用? 【发布时间】:2011-07-28 03:42:27 【问题描述】:

androidpostInvalidate()函数有什么用?我在很多地方都看到过这个功能。当我用 Google 搜索时,我得到了这么多:

postInvalidate-- 在 UI 线程上发布一个无效请求

我不知道那里的“无效请求”是什么意思。有人可以详细解释这里发生了什么吗?

【问题讨论】:

【参考方案1】:

从 View 类派生的每个类都有 invalidatepostInvalidate 方法。如果 invalidate 被调用,它会告诉系统当前视图已经改变,应该尽快重绘。由于此方法只能从您的 UIThread 调用,当您不在 UIThread 中并且仍想通知系统您的视图已更改时,需要另一个方法。 postInvalidate 方法从非 UIThread 通知系统,视图会尽快在 UIThread 的下一个事件循环中重绘。在 SDK 文档中也是 briefly explained。

只需比较 invalidatepostInvalidate

【讨论】:

感谢您的回答。我现在知道了。 我在您的回答中看到了逻辑,但 invalidate() 也适用于我的非 UI 类。和 postInvalidate() 一样好用。 很好的答案。 Android 文档没有解释它意味着重绘视图。立即清除它:) 正如@Sebastian 提到的,我还尝试了非UI 线程中的invalidate()postInvalidate()(使用Executors.newSingleThreadExecutor()),但它们都工作正常,至少似乎没有问题.有谁知道为什么?【参考方案2】:

通过这种方法 (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

【讨论】:

【参考方案3】:

简单来说,invalidate() 方法可以从 UI 线程调用,postInvalidate() 可以从非 UI 线程调用,以便告诉 android 在对其进行一些更改后更新我们的自定义视图。

【讨论】:

以上是关于postInvalidate() 有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

安卓invalidate和requestLayout还有postInvalidate的区别

invalidate和postInvalidate 的区别及使用

requestLayout invalidate postInvalidate

安卓invalidate和requestLayout还有postInvalidate的区别

android中Invalidate和postInvalidate的区别

Android requestLayout 和 invalidata , postInvalidate 比较