Android 布局优化 java.lang.StackOverflowError
最近做的一个安卓项目,由于层级复杂导致层级嵌套过多,结果在htc上的一款机器上长按文档框崩溃,报堆栈溢出异常, java.lang.StackOverflowError
android SDK中对该错误的出现的场景描述为:由于栈调用的层次太多,超过了虚拟器dalvik的最大限制(作为一个虚拟器参数,可定制)导致的。当程序编写错误导致无限递归调用时会触发,此外程序正确但是递归调用的层次过深也会触发。网上查找资料发现安卓布局层级过多也会导致这个异常。在 Android SDK 中包含了一个Heirachy Viewer 工具,在sdk tool 文件中,使用该工具可以在您的程序运行的时候分析程序的布局。使用该工具来发现布局中的瓶颈所在。Hierarchy Viewer 让你选择其连接的设备或者模拟器中的一个运行中的程序,然后显示该界面的布局树形结构。在每个控件方块中的交通灯分别代表 计算尺寸(Measure)、布局子控件(Layout)、和绘制的性能,通过颜色来帮助您分析潜在的问题。 使用这个工具可以很清晰的看到当前页面的层级结构,发现我的Edittext 处于10级以上,层级太深,尝试着优化布局。
1、使用<include /> 标签来重用layout代码,如果在一个项目中需要用到相同的布局设计,可以通过<include /> 标签来重用layout代码
2、使用<merge /> 标签来减少视图层级结构,merge也有一些使用限制: 只能用于xml layout文件的根元素;在代码中inflate一个以merge为根元素的布局文件时候,你需要指定一个ViewGroup 作为其容器,并且要设置attachToRoot 为true
最终使用merge标签,替换掉include中的根节点,解决上面的问题。