【发布时间】:2019-09-27 17:46:59
【问题描述】:
Android 的invalidate() 和postInvalidate() 方法有什么区别?每个人什么时候被调用?必须只在扩展 View 的类中调用方法吗?
【问题讨论】:
标签: android android-layout invalidation
Android 的invalidate() 和postInvalidate() 方法有什么区别?每个人什么时候被调用?必须只在扩展 View 的类中调用方法吗?
【问题讨论】:
标签: android android-layout invalidation
如果你想从 UI 线程重新绘制你的视图,你可以调用 invalidate() 方法。
如果您想从非 UI 线程重新绘制视图,您可以调用 postInvalidate() 方法。
从View 类派生的每个类都有invalidate 和postInvalidate 方法。如果 invalidate 被调用,它会告诉系统当前视图已经改变并且应该尽快重绘。由于此方法只能从您的 UI 线程中调用,因此当您不在 UI 线程中并且仍想通知系统您的视图已更改时,需要另一种方法。 postInvalidate 方法从非 UI 线程通知系统,并尽快在 UI 线程的下一个事件循环中重绘视图。 SDK 文档中也简要说明了这一点:
更新:
从其他线程使用 postInvalidate 时会出现一些问题(例如没有立即更新 UI),这样会更有效:
runOnUiThread(new Runnable() {
public void run() {
myImageView.setImageBitmap(image);
imageView.invalidate();
}
});
【讨论】:
onDraw 中调用 postInvalidate() 以在 UI 线程中的 View 上绘制饼图。