太长不看;先说结论:
- 当 view 已经 attach 到 window 时,这两个方法没有区别
- 当 view 还没 attach 到 window 时
- View#post 方法接收的 Runnable 参数会被包装一层,然后加到队列。等到 view 被 attach 到 window 之后才会被加入到对应线程的 MessageQueue 中。这样可以保证调用时,view 已经执行过 measure layout draw 流程。此时在 Runnable 中可以拿到正确的宽高。
- handler#post 方法,Runnable 会被直接添加到对应线程的 MessageQueue 中,然后被取出执行,跟 view 是否走完测量、布局、绘制 流程没有必然的联系,因此,可能会拿不到正确的宽高。
- View#post 方法接收的 Runnable 参数会被包装一层,然后加到队列。等到 view 被 attach 到 window 之后才会被加入到对应线程的 MessageQueue 中。这样可以保证调用时,view 已经执行过 measure layout draw 流程。此时在 Runnable 中可以拿到正确的宽高。
也就是说,如果我们要获取某个 view (称为 viewA)的宽高,最好是通过 viewA#post 方法,不然很有可能因为 view 的测量、布局流程还没走完。导致拿到错误的宽高。