Android7.0 View.post与Handler.post

在获取view宽高时,在Android6.0中使用handler.post()可以正常获取,而运行在Android7.0上则无法再获取。而在7.0上改为view.post()方法则又可以正常获取view宽高。

查看源码和相关资料后知道是因为,虽然这两个都是post(new runnable(){}),但两者最终将消息发送到的消息队列并不一定相同,区别在于View是否已attach到window上。
而view.post()在 Api23 和 Api24 中,executeActions() 方法的调用时机不同,导致 View 在没有 mAttachInfo 对象的时候,表现不一样。

验证测试:
我们在自定义view的layout()方法中添加

@Override
public void layout(@Px int l, @Px int t, @Px int r, @Px int b) {
   super.layout(l, t, r, b);
   Log.i("Demo","================view.layout");
}

在测量使用view的宽高处添加

view.post(new Runnable() {
         @Override
         public void run() {
            Log.i("Demo","----------------view.post");
                  }
      }); 
new Handler().post(new Runnable() {
         @Override
         public void run() {
            Log.i("Demo","----------------new Handler().post");
         }
      });

运行后可得到结果:
Android6.0:
这里写图片描述
Android7.0:
这里写图片描述

可知Android7.0时,当handler.Post执行时,view还没有执行layout方法,所以测出的宽高是0,而view.post执行在view的layout后,可以测出正确宽高。

参考资料:(重要)
1、view.post和Handler.post区别:http://blog.csdn.net/a740169405/article/details/69668957
2、API23和API24 view.post()变化:http://www.jb51.net/article/122395.htm

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值