Android使用ListView时出现StackOverflowError 产生的原因和解决方法


昨天用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了。



转载于:https://my.oschina.net/devuser/blog/198892

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值