1 postInvalidate()方法在非UI线程中调用,通知UI线程重绘。
2 Invalidate()方法在UI线程中调用,重绘当前UI。
首先打开源码:postInvalidate()方法
源码解释如下:
在下一个事件循环中通知重绘,在非UI线程中使用它去重绘。
我们继续追踪下去,最后会进入ViewRootImpl的dispatchInvalidateDelayed()方法。
第一行代码其实就是取出一个消息,给它的what字段赋上MSG_INVALIDATE值,给它的Object字段赋
上传入View的引用view。
然后再通过handler发送消息,那么接着看下这个消息在哪被处理了?
这个handler实际上是ViewRootHandler的实例化对象,而ViewRootHandler又是ViewRootImpl的一个内部类。
我们来看看它的handleMessage源码。
明白了,先通过msg.what字段查找该分支,然后通过msg.what获取到之前赋给的View引用,然后调用invalidate方法
就行了,最后注意一点:
ViewRootImpl是在主线程中被调用的,所以handleMessage方法是在主线程中调用的。。