昨天用ListView写的一个相似微博动态页面,在Android4.4上运行良好,在一款2.3系统的手机上运行崩溃,看log是java.lang.StackOverflowError(堆栈溢出)。java
Android SDK 场景描述为:因为栈调用的层次太多,超过了虚拟器dalvik的最大限制(做为一个虚拟器参数,可定制)致使的。当程序编写错误致使无限递归调用时会触发,此外程序正确可是递归调用的层次过深也会触发。布局
Google后发如今ListView中形成这种状况的缘由是布局嵌套太多形成的,因此我就看个人ListView Item 布局,去掉1、两层后发现仍是崩溃,最后就写一个控件,仍是崩溃,这样以后我就以为应该不是ListView中Item的问题,而后我就看ListView所在页面的布局,其父布局为LinearLayout线性布局嵌套,而后果断去掉一层父布局,结果ok。优化
最后提醒下开发人员,解决嵌套过深的基本思路是在实现一样的效果的前提下减小界面的layout深度。具体的方法有:spa
1) 多用RelativeLayout的各类布局属性来完成布局,而避免过多使用嵌套layout来实现。设计
2) 占位或填充剩余空间的元素多用View,避免使用layout等viewGroup。code
总结下,从实际的数据来看,设计中layout嵌套深度超过10层,就应该考虑下优化了,不然就会出现java.lang.StackOverflowError的crash了。orm