Android中刷新View的方法有以下几种:
-
调用invalidate()方法,该方法会使View树中的所有视图无效或脏,等待下一次绘制时重新绘制。例如:
mCustomView.invalidate();
-
调用postInvalidate()方法,该方法类似于invalidate()方法,不同之处在于该方法可以在非UI线程中调用。例如:
mCustomView.postInvalidate();
-
调用View的requestLayout()方法,该方法会使View重新计算大小和位置,并调用onMeasure、onLayout等方法进行布局。例如:
mCustomView.requestLayout();
invalidate() 和 requestLayout() 都会触发 View 的重新绘制,但是它们的作用是不同的。
invalidate() 会使 View 标记为无效,在 UI 线程空闲时重新绘制,因此它不会立即触发 View 的重新绘制,和执行次数多少无关,可以多次调用。invalidate() 的作用是告诉系统对该 View 进行重绘,如果 View 没有变化,那么它不会重新绘制,因此不会立即占用 CPU 资源。
requestLayout() 会使 View 的大小和布局都重新计算,因此它需要更多的 CPU 资源,它会在下一次的 measure 和 layout 过程中计算 View 的大小和位置,并重新布局。这个过程可能会非常消耗性能,因此应该尽量避免多次调用 requestLayout(),并在合适的时机调用。
因此,一般来说,invalidate() 比 requestLayout() 消耗的性能更少,但是具体情况需要根据实际场景来选择。如果只是 View 内部或者子 View 发生了改变,那么可以使用 invalidate();如果 View 的大小或者位置发生了改变,则需要重新布局,那么可以使用 requestLayout()。