【问题标题】:What is the difference between Android's invalidate() and postInvalidate() methods?Android 的 invalidate() 和 postInvalidate() 方法有什么区别?
【发布时间】:2019-09-27 17:46:59
【问题描述】:

Android 的invalidate()postInvalidate() 方法有什么区别?每个人什么时候被调用?必须只在扩展 View 的类中调用方法吗?

【问题讨论】:

    标签: android android-layout invalidation


    【解决方案1】:

    如果你想从 UI 线程重新绘制你的视图,你可以调用 invalidate() 方法。

    如果您想从非 UI 线程重新绘制视图,您可以调用 postInvalidate() 方法。

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

    CLICK HERE

    更新:

    从其他线程使用 postInvalidate 时会出现一些问题(例如没有立即更新 UI),这样会更有效:

    runOnUiThread(new Runnable() {
        public void run() {
        myImageView.setImageBitmap(image);
        imageView.invalidate();
        }
    });
    

    【讨论】:

    • 这不正是 postInvalidate() 的作用吗?
    • 在android的示例代码:developer.android.com/training/custom-views/index.html中,有一个PieChart.java,里面有属性getter和setter。大多数属性设置器调用 invalidate();。 PieChart.java 不是 UI 线程吗?它怎么会从那里调用 invalidate 呢? (有一个主活动java文件是主线程)。我本来希望调用 postinvalidate();就像他们在 PieChart.java 中的 onDraw 方法下所做的那样。
    • @Simon 我还没有查看代码,但 PieChart.java 仍将在 UI 线程上工作,除非它扩展 Thread 或指定另一个线程以其他方式使用。可能发生的情况是绘制了饼图,然后在饼图的 onDraw 中调用 postInvalidate() 以在 UI 线程中的 View 上绘制饼图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    相关资源
    最近更新 更多