android 为什么有时候拿不到View的宽高

本文探讨了在Android中为何有时在onCreate中使用View.post获取宽高可以成功,尽管onMeasure在performTranversal之后执行。原因是post的Runnable实际上会被添加到消息队列中,等待当前消息(performTranversal)完成后才执行,因此在适当的时间能获取到正确的宽高。
摘要由CSDN通过智能技术生成

最近在阅读Activity启动流程,从ActivityThread的handleLaunchActivity开始阅读。当阅读到ViewRootImpl的performTranversal时,发现View的dispatchAttachToWindow先于View的onMeasure执行,而在dispatchAttachToWindow里面会执行mRunQueue.excuteActions,这些actions就包含View.post(runnable)【如果你想通过View.post来获取View的宽高】,因为在Activity的onCreate里面调用View的post,runnable里面是可以拿到View的宽高的。而onCreate是先于performTranversal执行的,准确的说,performTranversal是在onResume之后执行的(所以在onResume里面也是拿不到View的宽高的)。那么在onCreate里面执行的post,在onMeasure之前,这个runnable就被执行了,为什么还能拿到宽高呢。

因为,这个runnable被执行的动作,其实只是向messageQueue里面添加了一个message。而Android的消息队列是处理完上一个才会执行下一个。而performTranversal这个动作自身就是一个message,所以只有当performTranversal执行完才会处理后面添加的。如下所示,Log打印顺序为:

 first msg start

 first msg end

 second msg

mHandler.post(new Runnable() {

    @Override
    public void run() {
        Log.d(TAG,"first msg start");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值