熟练布局优化、布局嵌套优化、ViewStub、懒加载、过度绘制优化;
1、布局优化常用手段有哪些?
答案
- 减少布局嵌套层级,避免多层 LinearLayout 嵌套;
- 优先使用 ConstraintLayout 约束布局,扁平化结构;
- 用 ViewStub 懒加载不立即显示的布局;
- 用 include 复用公共布局;
- 删除多余无用 View、减少没必要的容器布局;
- 合理使用 merge 标签减少层级。
2、什么是 ViewStub?作用和原理?
答案
ViewStub 是轻量级、无尺寸、默认不加载的布局占位控件。
作用:懒加载布局 ,一开始不 inflate、不占用内存,等到需要时再inflate 加载布局。
适用:弹窗、详情、网络错误页、默认空页面 等不常显示的布局。
3、ViewStub 优点
答案
不占用绘制资源、不加载视图、减少启动耗时、减少内存占用、优化页面渲染速度。
4、include、merge、ViewStub 三者区别
答案
- include:复用布局,直接引入布局文件,会增加层级;
- merge :配合 include 使用,减少一层嵌套,合并根布局;
- ViewStub :懒加载占位,默认不渲染,用时再加载。
5、什么是过度绘制(OverDraw)?
答案
同一个像素点 被多次重复绘制。
比如:底层背景 + 父布局背景 + 子布局背景 + 文字背景,同一位置叠了多层颜色,造成 GPU 冗余绘制,导致页面卡顿、耗电。
6、过度绘制怎么检测?
答案 开发者选项 → 开启 调试 GPU 过度绘制;屏幕颜色代表绘制层数:
- 无色:1 层 正常
- 蓝色:2 层 可接受
- 绿色:3 层 偏高
- 红色:4 层以上 严重过度绘制,必须优化
7、过度绘制怎么优化?
答案
- 去掉多余背景色,能不设就不设;
- 层级精简,减少嵌套布局;
- 避免父布局和子布局重复设置背景;
- 自定义 View 优化 onDraw,减少无效重绘;
- 用裁剪区域,只绘制需要刷新的区域;
- 主题背景和布局背景合并,避免重复铺底色。
8、什么是布局懒加载?有哪些实现方式?
答案
懒加载:只在需要显示时再加载布局、请求数据,不提前加载浪费性能。
实现方式:
- ViewStub 布局懒加载
- Fragment 可见性懒加载(ViewPager 预加载优化)
- 网络数据懒加载,页面可见再请求接口
9、为什么要减少布局嵌套?
答案
布局层级越深,测量、布局、绘制耗时越长;
inflate 解析慢、UI 渲染慢、容易卡顿、拖慢冷启动和页面跳转速度。
10、ConstraintLayout 为什么能优化布局?
答案
可以实现扁平化布局,一层根布局搞定复杂 UI,不用多层嵌套;减少测量和布局遍历次数,提升绘制性能。
极简背诵浓缩版
布局优化核心:减少嵌套、多用 ConstraintLayout、include 复用、merge 减层级、ViewStub 懒加载。ViewStub 是轻量级占位,默认不加载,用时再 inflate,省内存省渲染。过度绘制是同一像素多层重复绘制,通过开发者工具检测,删掉多余背景、精简层级、减少重复铺色来优化。懒加载通过 ViewStub、Fragment 可见性控制,延迟加载布局和网络数据,提升首屏速度和性能。