最近做一个项目过程中发现一个问题,经常报StackOverflowError错误,查找资料后发现是因为布局嵌套层次太多。
因为项目UI比较复杂,我使用了ActivityGroup里面再嵌套TabHost,测试发现目前在其他手机上都没问题,只有在HTC手机某些型号上才会出现StackOverflowError的错误。我将布局精简后就可以在HTC机器上使用了。
难道java或者android中有对布局层级的限制吗?或者对栈空间(不是堆空间)的大小限制?

解决方案 »

  1. 嵌入布局最大深度为10!
    太多的话根本画的很卡的。
    建议你看这篇文章。
    http://wiki.eoeandroid.com/Optimizing_Layout_Hierarchies
      


  2. 这个10是怎么定义出来的呢?是统计的结果,还是Android本来就可以配置?现在在不同手机上嵌套最大层次还是不同的。另外,Android框架还会自动在布局上添加一些层级的
      

  3. 但是有时候对于比较复杂的布局,很难控制的
    现在我使用的布局是ActivityGroup里面嵌套TabHost,TabHost里面再放具体的Activity。因为这三个东西添加的时候系统会自动添加PhoneWindow$DecorView——FrameLayout(id/content)——FrameLayout这三层,所以这时候我什么布局都不写就已经有3*3=9层布局了。再随便添加一些自定义的布局,随随便便就十六七层了。远远超过了要求的10层。
    而且即使是十几层在一般手机上显示也都没有问题,就是有些手机不太支持
      

  4. 可以选择relativelayout啊。尽量少嵌入layout,你看android dev里面讲绘图那一章很清楚的说了是如何进行绘图的,布局是要来回计算两次以上才能确定,再一个一个绘制,所以多了会很慢很慢。
      

  5. 有谁知道Android中栈空间最大为多少?例如VC中的栈默认就分配2M
      

  6. 2^10 = 1K字节
    2^20 = 1M字节
    2^30 = 1G字节嵌套30层的话,就算每次函数调用只需要一个字节,也最起码总共需要1G字节的栈。所以不能嵌套太多的层。
    Android的界面配置太方便灵活了,以至于容易忽略嵌套的层数。
      

aliyun

类似问题 »