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

你可能感兴趣的:(Android)