onResume中度量宽高是否可以?

不确定,需要看onResume在什么时候执行。

viewRootImpl需要在执行了requestLayout()之后才会执行onResume方法;

而没用执行requestLayout()方法的话就不会调用WindowManager的updateViewLayout()方法,就不会继续执行ViewRootImpl中的setLayoutParams、scheduleTraversals、doTraversals以及Session的relayout、WMS中的relayoutWindow方法。没有这套流程的方法就不会有度量控件宽高的执行,因此onResume中获取不到宽高。

onResume方法中通过new Handler().post()可不可以?

不可以。view还没有onMeasure()

setView–》requestLayout–》checkThread–》scheduleTraversals-》

scheduleTraversals中执行了mHandler.getLooper().getQueue().postSyncBarrier();

UI的刷新也是一个个MSG,UI的刷新是在主线程进行,而主线程队列可能堆积过多的MSG;在UI队列中为了保障UI刷新的MSG准时刷新,引入了消息屏障机制

屏障消息没有target。

private int postSyncBarrier(long when){synchronized (this){final int token = mNextBarrierToken++;final Message msg = Message.obtain();msg.markInUse();msg.when = when;msg.argl = token;Message prev = null;Message p = mMessages;if (when != 0){while (p != null && p.when <= when){prev = p;p = p.next;}}if (prev != null){msg.next = p;prev.next = msg;}else {msg.next = p;mMessages = msg;}return token;}
}//no target  优先执行
synchronized(this){Message prevMsg = null;Message msg = mMessage;if(msg != null && msg.target == null){do{prevMsg = msg;msg = msg.next;}while(msg != null && !msg.isAsynchronous());}if(msg != null){//do ......}
}

而new Handler().post()方法在执行时屏障消息还没有执行,还没有执行requestLayout,也还没有执行scheduleTraversals,ui的屏障消息还没有执行,因此UI还没有刷新。

new Handler().postDelayed(,17);应该就能拿到宽高。

线程中view.setText一定会报错吗?

在onCreate中的新建子线程,view.setText()只是将内容存储到了view,都还没有执行addVIew操作更不会有UI刷新操作,因此不会报错,也不会有异常;在onResume中执行也不会出错,同理。如果在其他地方执行,已经进行了UI的刷新操作。如果再次进行子线程设置text的操作,WMS会检测到就会报错。

view的绘制过程都是用的同一个Canvas吗?

vieRootImpl中有preformDraw,在其中调用Draw函数,在该函数中调用drawSoftware函数,在这个函数中会调用canvas = mSurface.lockCanvas(dirty); 再调用mView.draw(canvas),然后再调用view类中的draw。

该draw()函数会先执行drawBackground(canvas)方法,然后执行onDraw(canvas)方法,然后执行dispatchDraw(canvas)将canvas分发给孩子。因此是用的同一个canvas

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KL7qJkqh-1638964830173)(C:\Users\wangshuo\AppData\Roaming\Typora\typora-user-images\image-20211208195831454.png)]
patchDraw(canvas)将canvas分发给孩子。因此是用的同一个canvas

onResume中是否可以度量宽高?相关推荐

  1. Android源码—为什么onResume方法中不可以获取View宽高

    前言 有一个经典的问题,我们在Activity的onCreate中可以获取View的宽高吗?onResume中呢? 对于这类八股问题,只要看过都能很容易得出答案:不能. 紧跟着追问一个,那为什么Vie ...

  2. Android 在onCreate()方法中获取控件宽高值为0解决方案

    大家很多时候需要在Activity或者Fragment的onCreate()方法中获取声明的空间的高度或者宽度,进行位置移动或者其他操作,但是当调用 view.getHeight() 或者 view. ...

  3. js获取svg中g元素的宽高

    这里有一个g元素: <g id="g_main" transform="translate(120,2804.5)"><rect>< ...

  4. css3中使用calc()计算宽高

    calc()是什么? 是CSS3中新增的一个函数,calculate(计算)的缩写.用于动态计算宽/高,你可以使用calc()给元素的各个属性设置值[margin.border.padding.fon ...

  5. 移动端获取当前屏幕的高度_css中获取屏幕的宽 高

    阅读数:26120 网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body ...

  6. 在任意类中获得屏幕的宽高

    /** 获取手机的屏幕宽 */ public static int getSW(Context context) {int sw;WindowManager wm = (WindowManager) ...

  7. Flutter中Contrainer 组件的宽高限制分析

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. ** 你可能需要 CSDN 网易云课堂教程 掘金 EDU学院教程 知乎 Flutter系列文章 头条同步 百度同步 本 ...

  8. android 自定义控件的宽高_巧用Handler获取View控件信息

    众所周知,在Android实际开发中,对于某些复杂多变的情况,控件的位置摆放.大小控制并非是xml类型的layout文件完全可以搞定的.此时,我们通常会使用Java代码来通过动态计算,将指定的控件摆放 ...

  9. Android获取View宽高的常见方式

    背景 有时我们会有基于这样的需求,当Activity创建时,调用View.getWidth.View.getHeight().View.getMeasuredWidth() .View.getgetM ...

最新文章

  1. 2019-10-27 控制领域期刊介绍
  2. c cuda 指定gpu_《CUDA C编程权威指南》——1.3 用GPU输出Hello World-阿里云开发者社区...
  3. 使用timer控件创建一个简单的报警程序
  4. 五、scrapy爬虫框架——logging 模块的使用
  5. Java线程start()vs run()方法及示例
  6. 快速卷积与快速相关——MATLAB
  7. python如何创建模块视频_Python | 如何创建模块(模块示例)?
  8. Android小知识-了解下Android系统的显示原理
  9. (31)FPGA原语设计(IBUFG)
  10. java运算符使用总结_Java运算符知识点总结
  11. 实验代做 行人识别_《行人跨模态重识别 | 双向限制的排序损失》
  12. iOS底层探索之多线程(五)—GCD不同队列源码分析
  13. VCS学习(2)debug simulation mismatches
  14. 小明上学201812-1
  15. C++高级进阶 第二季:mutable 关键字
  16. hping3拒绝服务攻击小结
  17. pdf文件如何生成目录 wps_利用wps创建有目录的PDF/word
  18. ESP32-S3 USB UART 下载总结
  19. Spring AOP原理详解及实例
  20. 阻塞IO和NIO的区别

热门文章

  1. 大数据项目实战——实时推荐系统算法原理
  2. 太阳能光伏材料行业调研报告 - 市场现状分析与发展前景预测
  3. Vue3中shallowReactive 与 shallowRef 的用法
  4. 深度解析云安全责任共担模型
  5. 充电器用着用着就松了怎么办_手机充电器用的时间长了,为什么接口处会变松?...
  6. 计算机制图水平测试成绩查询,普通话水平测试成绩查询系统平台
  7. acwing788. 逆序对的数量
  8. 二叉树遍历的递归算法
  9. 身份证验证 - iOS
  10. python中怎么表示正数_python中整数除法的正负号