Android 你知道界面布局嵌套多少层之后会Crash吗
我们先放一张Hierarchy Viewer的图:(模拟器Android4.4)
看到数字6了吗,那个RelativeLayout是MainActivity的根ViewGroup, 而在RelativeLayout之前还有5层, 即系统默认的界面DecorView(FrameLayout) --> LinearLayout --> FramelLayout-- >ActionBarOverlayLayout --> ContentFrameLayout.
直接说结果吧,用模拟器在API19 也就是Android4.4 上最大可以嵌套39层,包含系统默认的5层,也就说我们最大可以写34层的嵌套。
当嵌套层数达到40层时报如下异常,
10-27 11:38:53.901 25582-25582/com.aquarius.customview E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.aquarius.customview, PID: 25582java.lang.StackOverflowErrorat android.util.Pools$SynchronizedPool.acquire(Pools.java:154)at android.view.GLES20RecordingCanvas.obtain(GLES20RecordingCanvas.java:43)at android.view.GLES20DisplayList.start(GLES20DisplayList.java:61)at android.view.View.getDisplayList(View.java:13323)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)at android.view.View.getDisplayList(View.java:13357)at android.view.View.getDisplayList(View.java:13404)at android.view.View.draw(View.java:14182)at android.view.ViewGroup.drawChild(ViewGroup.java:3103)at android.view.View
View Code
在API23 Android6.0上嵌套层数可以更多,实验了四十多层还依旧没有crash
至于具体低于4.4的版本是什么样的结果,我并没有测试,且Android开源各大手机厂商可能会修改逻辑。不过考虑到向下兼容的问题,还是不应该嵌套太多层数,
当自己写的布局层级超过10层的时候就该考虑优化布局了,因为即使应用不因为嵌套的太多而crash,也会造成渲染时间过长等问题,影响UI流畅度。
转载于:https://www.cnblogs.com/sphere/p/7745687.html
Android 你知道界面布局嵌套多少层之后会Crash吗相关推荐
- Android 和 iPhone 界面布局示例
下图是根据Android和iPhone这两个平台的"生产内容型的应用程序"整理出来的界面布局示例.所对比的4个点,均是两大平台的应用程序常规界面元素. 状态栏: Android和i ...
- android开发UI界面布局教学,android UI学习 -- 设置界面的布局(包括style的使用,selector的使用,Checkbox自定义样式,菜单项的样式)...
最终实现效果如下图: 具体来说就是实现了checkbox自定义选中和为选择样式,菜单项根据不同位置设置不同背景. 先上整体布局文件代码: xmlns:tools="http://schema ...
- 【为Android 应用创建 XML 布局】
上一篇:[Kotlin 中的类和继承] 一.准备工作 在此文章中,您将为一个基本的小费计算器应用构建布局.在此文章结束时,该应用将拥有一个可以运行的界面,但它实际上还无法计算小费.通过接下来的几个文章 ...
- 【Android 性能优化】布局渲染优化 ( CPU 渲染优化 | 减少布局的嵌套 | 测量布局绘制时间 | OnFrameMetricsAvailableListener | 布局渲染优化总结 )
文章目录 一. 减少布局嵌套 二. 布局渲染时间测量 1. FrameMetrics 使用流程 2. FrameMetrics 参数解析 3. FrameMetrics 代码示例 三. 布局渲染优化总 ...
- Android studio 在线性布局下嵌套相对布局
Android studio 新建一个项目,修改XML如下: 项目Activity名称为:MyRelativeLayout <?xml version="1.0" encod ...
- Android APP字体随系统字体调整造成界面布局混乱问题解决方案
一.遇到的问题 当用户调整系统字体大小的时候,APP的字体一般也都会跟随改变,进而导致某些界面布局排版混乱. 下面先说一下关于sp单位的理解 sp单位除了受屏幕密度影响外,还受到用户的字体大小影响,通 ...
- android 布局分析,关于Android应用程序界面五大布局的图文分析教程
对于安卓系统应用开发中界面的布局有五大类,分别是LinearLayout(线性布局).FrameLayout(单帧布局).AbsoluteLayout(绝对布局).TablelLayout(表格布局) ...
- Android和iPhone应用程序界面布局示例
下图是根据Android和iPhone这两个平台的"生产内容型的应用程序"整理出来的界面布局示例.所对比的4个点,均是两大平台的应用程序常规界面元素. 状态栏: Android ...
- Android精讲--界面编程2(布局管理器)
为什么需要布局管理器 为了更好地管理Android应用的用户界面里的各种组件,Android提供了布局管理器.通过使用布局管理器,Android应用的图形用户界面具有良好的平台无关性.通常来说,推荐使 ...
最新文章
- 关于spring中commons-attributes-compiler.jar的使用问题
- 合种侧柏、云杉专车2-3天领证
- mysql8.0 zip安装教程
- 手把手构建LSTM的向前传播(Building a LSTM step by step)
- 报表-对于多数据进行 分sheet以及 分workbook处理
- [云炬创业学笔记]第一章创业是什么测试9
- Addr、@运算符与Pointer类型
- 关于猿如何找对象,心里没点那啥数吗?
- 前端学习(3226):回调形式的ref
- VMware14.1 Ubuntu16.04安装教程
- 第六章 计算机性能测试
- 执行容器内的shell_你的Docker容器可能充满了Graboid加密蠕虫
- python语言入门q-Python基础教程中的函数
- Linux学习总结(72)——Linux系统安全加固
- Ajax Loader 图标
- Atitit,通过pid获取进程文件路径 java php c#.net版本大总结
- 考试系统分析对比考试系统哪个好
- android studio怎么创建布局,Android Studio--活动创建简单布局
- 我的微语录周记2012-08-20---2012-…
- 羽毛球之混双战术要点