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

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

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

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

【问题讨论】:

    标签: android android-layout invalidation


    【解决方案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 在对其进行一些更改后更新我们的自定义视图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 2011-07-17
        • 2014-09-13
        相关资源
        最近更新 更多