【Android面试】关于post你真的了解吗?

思考:view.post()handler.post()有什么区别?
有时候我们在onCreat里面无法获取到控件宽高,调用view.post()就可以获取到了。为什么呢?

下面是view.post()源码
【Android面试】关于post你真的了解吗?
可见当View已经attach到window,直接调用UI线程的Handler发送runnable。如果View还未attach到window,将runnable放入ViewRootImpl的RunQueue中。

handler.post()源码
【Android面试】关于post你真的了解吗?

直接调用UI线程的Handler发送runnable到MessageQueue

总结:

当View已经attach到了window,两者是没有区别的,都是调用UI线程的Handler发送runnable到MessageQueue,最后都是由handler进行消息的分发处理。
但是如果View尚未attach到window的话,runnable被放到了ViewRootImpl#RunQueue中,最终也会被处理,但不是通过MessageQueue。

我们经常碰到一个问题,就是new一个View之后,通过addView添加到视图树或者是在Activity的onCreate方法里调用setContentView方法。紧接着,我们想获取View的宽高,但是因为view的measure和layout都还未执行,所以是获取不到宽高的。
view.post()的一个作用是,在下一个performTraversals到来的时候,也就是view完成layout之后的第一时间获取宽高。

微信扫一扫或者长按二维码关注我的微信公众号
【Android面试】关于post你真的了解吗?


【程序猿小白成长记】定期分享各类Java、Android等知识