zoukankan      html  css  js  c++  java
  • 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: main
                                                                             Process: com.aquarius.customview, PID: 25582
                                                                             java.lang.StackOverflowError
                                                                                 at 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流畅度。

    特别声明:如果转载,请保留出处信息,感谢您的关注和推荐!!
  • 相关阅读:
    Eclipse设置、调优、使用
    eclipse安装插件的方式 三种:links、eclipse中使用插件安装向导安装、直接copy插件到对应的eclipse目录 MyEclipse10安装SVN插件
    eclipse 在Servers窗口创建一个Tomcat 6.0 Server失败
    小技巧:帮你批量删除代码前的行号
    editplus发布3.01 Build 446 Final版(附下载及中文版)
    eclipse 垃圾回收器,内存释放
    eclipse.ini的相关说明
    Eclipse 去掉JavaScript Validator
    DropBox 超实用的免费文件网络同步、备份、分享工具
    使用EditPlus技巧,提高工作效率(附英文版、自动完成文件、语法文件下载)
  • 原文地址:https://www.cnblogs.com/sphere/p/7745687.html
Copyright © 2011-2022 走看看