1 postInvalidate()方法在非UI线程中调用,通知UI线程重绘。

 2 Invalidate()方法在UI线程中调用,重绘当前UI。

首先打开源码:postInvalidate()方法

从源码角度理解postInvalidate和Invalidate

从源码角度理解postInvalidate和Invalidate

源码解释如下:

在下一个事件循环中通知重绘,在非UI线程中使用它去重绘。

我们继续追踪下去,最后会进入ViewRootImpl的dispatchInvalidateDelayed()方法。

从源码角度理解postInvalidate和Invalidate

从源码角度理解postInvalidate和Invalidate

第一行代码其实就是取出一个消息,给它的what字段赋上MSG_INVALIDATE值,给它的Object字段赋

上传入View的引用view。

然后再通过handler发送消息,那么接着看下这个消息在哪被处理了?

这个handler实际上是ViewRootHandler的实例化对象,而ViewRootHandler又是ViewRootImpl的一个内部类。

我们来看看它的handleMessage源码。

从源码角度理解postInvalidate和Invalidate

从源码角度理解postInvalidate和Invalidate

明白了,先通过msg.what字段查找该分支,然后通过msg.what获取到之前赋给的View引用,然后调用invalidate方法

就行了,最后注意一点:

ViewRootImpl是在主线程中被调用的,所以handleMessage方法是在主线程中调用的。。






相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-11-03
  • 2021-07-30
  • 2022-01-06
  • 2021-11-22
  • 2021-04-15
猜你喜欢
  • 2022-01-03
  • 2022-12-23
  • 2021-05-18
  • 2022-12-23
  • 2022-01-06
  • 2022-12-23
  • 2021-05-16
相关资源
相似解决方案