[Android] 解析View的post方法

    来自马小姐的嘲笑。

    Handler本身的post方法只是将Runnable包成Message放入消息队列,但是View的post做了额外的处理。废话不多说上代码。

[Android] 解析View的post方法_第1张图片

    可以看到VIew的post方法里面做了一个判断。如果AttachInfo不为空时,会使用其中的Handler去post这个Runnable。如果为空,则执行了HandlerActionQueue的post。看看如果为空的时候的逻辑:

[Android] 解析View的post方法_第2张图片

    可以看到实际上是Runnable封装成了一个HandlerAction对象,然后存放到Pending数组里面。GrowingArrayUtils的append方法实际上是一个数组自动扩容的逻辑:

[Android] 解析View的post方法_第3张图片

    那现在有个问题了,AttachInfo什么时候为空呢?

[Android] 解析View的post方法_第4张图片

    答案是当view被调用dispatchAttachedToWIndow方法的时候,会把AttachInfo赋值;当调用dispatchDetachedFromWindow是会将其置空。也就是说当View处于attachedToWIndow状态的时候,会调用AttachInfo中的Handler直接post这个Runnable;当处于detachedFromWindow的时候会将Runnable封装存入一个Pending数组。而dispatchAttachedToWIndow还有这样一个逻辑:

    也就是说当处于detached状态下post的被放入Pending数组中的Runnable会在View dispatchAttachedToWIndow的时候再执行。那什么时候View会被dispatchAttachedToWIndow呢?

    通过查看ViewGroup中的代码,View的dispatchAttachedToWIndow是会在View requestLayout之后再去调。这就解释了为什么在写一些依赖于View的高宽位置等属性的逻辑时要使用View的post方法。

你可能感兴趣的:(Android)