Android开发出现 StackOverflowError
问题:StackOverflowError
在HTC或者摩托罗拉的手机上测试出现 StackOverflowError 的错误。

06-12 10:28:31.750: E/AndroidRuntime(13995): FATAL EXCEPTION: main 06-12 10:28:31.750: E/AndroidRuntime(13995): java.lang.StackOverflowError 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.text.Layout.getLineForOffset(Layout.java:1059) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.text.Layout$Ellipsizer.getChars(Layout.java:2270) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.text.TextUtils.getChars(TextUtils.java:70) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.graphics.Canvas.drawText(Canvas.java:1328) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.text.Layout.draw(Layout.java:651) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.widget.TextView.onDraw(TextView.java:4326) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.view.View.draw(View.java:7094) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.view.ViewGroup.drawChild(ViewGroup.java:1732) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.view.View.draw(View.java:6988) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.view.ViewGroup.drawChild(ViewGroup.java:1732) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.view.View.draw(View.java:6988) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.view.ViewGroup.drawChild(ViewGroup.java:1732) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.view.ViewGroup.drawChild(ViewGroup.java:1730) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.view.ViewGroup.drawChild(ViewGroup.java:1730) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.view.ViewGroup.drawChild(ViewGroup.java:1730) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 06-12 10:28:31.750: E/AndroidRuntime(13995): at android.view.View.draw(View.java:6988)

从前面几行分析,跟文本控件有关。最后问题定位结果就是因为listView中textVIew嵌套太深所至。
我的listVIew布局层是这样的:
Listview--->RelativeLayout--->RelativeLayout--->RelativeLayout--->LinearLayout--->TextView
改为:
Listview--->RelativeLayout--->RelativeLayout--->RelativeLayout --->TextView
总结:尽可能的使用简单的布局和视图
如果一个窗口包含很多的视图,那么启动时间长、测量时间长、绘制时间长、布局时间长;如果视图树深度太深,会导致StackOverflowException异常,和用户界面反映会很慢很慢,如果在ListView 或者 GridView中使用则会更加严重。因此建议各位使用布局的时候,一定要选择合理的布局,复杂的堆砌即使解决了我们对复杂布局的处理,却很有可能降低我们程序的阅读效率,甚至抛出意想不到的异常。
解决的方法:
1.使用TextView的复合drawables,减少层次(该方法我们开发过程中屡试不爽!!!)
2.使用ViewStub延迟展开视图
3.使用<merge>合并视图
4.使用RelativeLayout减少层次
5.自定义布局
详细见:http://www.cnblogs.com/felix-hua/archive/2012/01/06/2314963.html
以上见解纯属个人理解,欢迎大家多多指教,共同学习,共同进步!
Android开发出现 StackOverflowError的更多相关文章
- Android开发中StackOverflowError
Android开发中StackOverflowError错误实例分析 一.概述 我在一个复杂的layout嵌套较多的android界面,碰到了java.lang.StackOverflowError这 ...
- [转]Android开发最佳实践
——欢迎转载,请注明出处 http://blog.csdn.net/asce1885 ,未经本人同意请勿用于商业用途,谢谢—— 原文链接:https://github.com/futurice/and ...
- Android开发最佳实践
Android开发最佳实践 摘要 ●使用 Gradle 和它推荐的工程结构 ●把密码和敏感数据放在gradle.properties ●不要自己写 HTTP 客户端,使用Volley或OkHttp库 ...
- Android 开发最佳实践
原文地址:https://github.com/futurice/android-best-practices/blob/master/translations/Chinese/README.cn.m ...
- Android 开发必备的知识点——JVM基础【转】
image 1.JVM与操作系统的关系 Java Virtual Machine JVM 全称 Java Virtual Machine,也就是我们耳熟能详的 Java 虚拟机.它能识别 .class ...
- Android学习探索之Java 8 在Android 开发中的应用
前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...
- Android 开发一定要看的15个实战项目
前言: 虽说网上有太多的Android课程,但是大多都是视频,有Android在线开发环境的几乎没有,但是对于学习Android的人来说拥有在线的Android开发环境是非常好的,可以随时动手操作学习 ...
- Android开发学习之路-关于Exception
Exception在Java中是表示异常的一个类.它是Throwable的子类. 而Exception的子类RuntimeException是一个特殊的异常类,在代码中不需要对此类进行throw,而是 ...
- Android开发学习之路-Android中使用RxJava
RxJava的核心内容很简单,就是进行异步操作.类似于Handler和AsyncTask的功能,但是在代码结构上不同. RxJava使用了观察者模式和建造者模式中的链式调用(类似于C#的LINQ). ...
随机推荐
- rpm 软件包
rpm 软件包 Linux 中有安装软件方式有两种,源码安装以及软件包安装: 压缩包:源码包,编译后安装 rpm(redhat package manager 红帽软件包管理):需要编译,直接安装 ...
- Codeforces Round #459 (Div. 2):D. MADMAX(记忆化搜索+博弈论)
题意 在一个有向无环图上,两个人分别从一个点出发,两人轮流从当前点沿着某条边移动,要求经过的边权不小于上一轮对方经过的边权(ASCII码),如果一方不能移动,则判负.两人都采取最优策略,求两人分别从每 ...
- 代码修改shader Properties uniform变量
2.4 Shader的数据接口:属性和 uniform变量 如果我们想设定一个特定的值到Shader,即为了在实例化Shader为Material时,可以通过为属性赋值达到创建具体对象的目的, ...
- 【转】Js 数组转JSON格式
要点1:转化函数 JSON.stringify() 要点2:在js里写数组的时候是var data = new Array() 但是你如果是要转json显示的时候就要写成 var data = {}, ...
- 部署开发以太坊dapp的四种方式
我们已经学习了4种开发和部署智能合约的方法: 第1种是使用 Truffle 和 Ganache .由于我们从上一篇教程中复制了代码,所以我想告诉你,有些插件可用于目前最流行的文本编辑器和 IDEs.有 ...
- 获取URL地址栏参数(正则表达式)
]] = isEncode ? decodeURIComponent(arg[2]) : arg[2]; }); return obj;}
- PJzhang:子域名发掘工具Sublist3r
猫宁!!! 参考链接:https://www.freebuf.com/sectool/90584.html 作者上一次更新是2018年10月16日了,sublist3r中融合有另外一个子域名爆破工具S ...
- Django模板语言,标签整理
Django模板语言 标签 内置标签引用 1. autoescape 控制自动转义是否可用. 这种标签带有任何 on 或 off 作为参数的话,他将决定转义块内效果. 该标签会以一个endautoes ...
- 2019湘潭校赛 G(并查集)
要点 题目传送 题目本质是每个点必属于两个集合中的一个,伴随的性质是:如果一个人说别人true,则他们一定属于同一阵营:如果说别人fake,一定不属于同一阵营. 每个点拆为\(i\)和\(i + n\ ...
- 前端HTML(二/三)
待补充 一.字体标签 字体标签包含:h1~h6.<font>.<u>.<b>.<strong>.<em>.<sup>.<s ...