Android中requestLayout、invalidate以及postInvalidate

0 概述

我们知道,Android中View的绘制,需要由顶层ViewGroup开始,依次执行measure、layout以及draw的过程。当程序员需要刷新界面时,常用的有requestLayout、invalidate以及postInvalidate这几个方法。
我们先看一下View绘制流程,便于后续理解:http://www.jianshu.com/p/373293385cc4
下面讲述一下这几个方法的不同:

image.png

1 requestLayout流程

image.png

requestLayout的时候,会根据责任链模式,将事件向上传递给ViewRootImpl,最终调用View
RootImpl的requestLayout方法,开启一轮新的measure、layout以及draw的过程。

2 invalidate流程

image.png

invalidate是失效的意思,该函数在主线程调用,同样会走到ViewRootImpl的performTraversals当中,但是由于标志位的不同,不会像requestLayout一样,而是只进行draw过程。

3 postInvalidate

这个方法是在子线程调用,通过Handler发送异步消息到主线程,最终还是会走到invalidate当中。

4 总结

一般来说,如果View确定自身不再适合当前区域,比如说它的LayoutParams发生了改变,需要父布局对其进行重新测量、布局、绘制这三个流程,往往使用requestLayout。而invalidate则是刷新当前View,使当前View进行重绘,不会进行测量、布局流程,因此如果View只需要重绘而不需要测量,布局的时候,使用invalidate方法往往比requestLayout方法更高效。