[Android] 解析View的post方法

    来自马小姐的嘲笑。

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

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

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

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

    答案是当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方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值