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). ...
随机推荐
- dialog 设置maxHeight 最大高度
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);Displ ...
- mysql由浅入深探究(四)----mysql事务详解
什么是事务: 通俗的解释就是对数据库进行的一组完整的操作,这组完整的操作中包含一个或多个操作.解释的太low了,来点官方的:事务就是DBMS中执行的一个完整的逻辑单元,这个逻辑单元中包含一个或者多个操 ...
- JQ 获取ul\ol 下面li的个数
使用 jQuery 获取 ul 下面 li 的个数,那么我们需要遍历我们的ul.如果你的ul有class .id 或两者都没,您可以使用 ul 标签来遍历. //遍历ul 获取li个数 $(" ...
- xampp搭建discuz论坛
xampp搭建discuz论坛 软件相关 xampp 下载 1.下载xampp,地址 2.下载discuz,地址 配置 1.安装xampp并启动apache和mysql 2.将discuz安装包中的u ...
- Hadoop安装包下载方法
Hadoop3.0版本的诞生,引入了很多新功能,为了验证Hadoop2.0与3.0版本的性能,需下载Hadoop的不同版本.故下文演示如何下载Hadoop安装包的方法. 1. 进入Apache Had ...
- Java IO 输入和输出流
数据流是指一组有顺序的,有起点和终点的字节集合. 最初的版本中,java.io 包中的流只有普通的字节流,即以 byte 为基本处理单位的流.字节流用来读写 8 位的数据,由于不会对数据做任何转换,因 ...
- values.xml:3:5-58:857: AAPT: error: resource android:attr/fontVariationSettings not found.
修改app/build.gradle中的版本 compileSdkVersion 28 targetSdkVersion 28 具体不知道为何要修改为28,但在android/build.gradle ...
- 补充:jQuery的ajax
一.jQuery的ajax 什么是ajax AJAX = 异步的javascript和XML(Asynchronous Javascript and XML) 简言之,在不重载整个网页的情况下,AJA ...
- FusionCharts的类 - 实例功能
一.FusionCharts的类 - 实例功能 1.configure(name:string , value:string) or configure(configurations: Objec ...
- 牛客网Java刷题知识点之什么是异常、异常处理的原理是什么、为什么要使用异常、异常体系、运行时异常、普通异常、自定义异常、异常链
不多说,直接上干货! 在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因素,这就是所谓的智者千虑必有一失.同样的道理,计算机的世界也是不完美的,异常情况随时都会发 ...