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