问题: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的更多相关文章

  1. Android开发中StackOverflowError

    Android开发中StackOverflowError错误实例分析 一.概述 我在一个复杂的layout嵌套较多的android界面,碰到了java.lang.StackOverflowError这 ...

  2. [转]Android开发最佳实践

    ——欢迎转载,请注明出处 http://blog.csdn.net/asce1885 ,未经本人同意请勿用于商业用途,谢谢—— 原文链接:https://github.com/futurice/and ...

  3. Android开发最佳实践

    Android开发最佳实践 摘要 ●使用 Gradle 和它推荐的工程结构 ●把密码和敏感数据放在gradle.properties ●不要自己写 HTTP 客户端,使用Volley或OkHttp库 ...

  4. Android 开发最佳实践

    原文地址:https://github.com/futurice/android-best-practices/blob/master/translations/Chinese/README.cn.m ...

  5. Android 开发必备的知识点——JVM基础【转】

    image 1.JVM与操作系统的关系 Java Virtual Machine JVM 全称 Java Virtual Machine,也就是我们耳熟能详的 Java 虚拟机.它能识别 .class ...

  6. Android学习探索之Java 8 在Android 开发中的应用

    前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...

  7. Android 开发一定要看的15个实战项目

    前言: 虽说网上有太多的Android课程,但是大多都是视频,有Android在线开发环境的几乎没有,但是对于学习Android的人来说拥有在线的Android开发环境是非常好的,可以随时动手操作学习 ...

  8. Android开发学习之路-关于Exception

    Exception在Java中是表示异常的一个类.它是Throwable的子类. 而Exception的子类RuntimeException是一个特殊的异常类,在代码中不需要对此类进行throw,而是 ...

  9. Android开发学习之路-Android中使用RxJava

    RxJava的核心内容很简单,就是进行异步操作.类似于Handler和AsyncTask的功能,但是在代码结构上不同. RxJava使用了观察者模式和建造者模式中的链式调用(类似于C#的LINQ). ...

随机推荐

  1. 3d全景图

    http://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Aggarwal_Panoramic_Stereo_Videos_CV ...

  2. Spark HA 配置中spark.deploy.zookeeper.url 的意思

    Spark HA的配置网上很多,最近我在看王林的Spark的视频,要付费的.那个人牛B吹得很大,本事应该是有的,但是有本事,不一定就是好老师.一开始吹中国第一,吹着吹着就变成世界第一.就算你真的是世界 ...

  3. Spring - SpringIOC容器详解

    一.什么是Spring IOC: Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想. 在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是 ...

  4. 利用system.reflection遍历一个类的变量成员

    假设有下面一个类,在程序中已初始化,如何获取里面的变量成员name,age,onduty及其值呢? public class Employee { public string name; public ...

  5. 12pm 究竟是中午还是午夜

    12pm是中午=12noon12am是午夜=12midnightMN-midnight(午夜,中午) AM是after midnight开头字母 PM是prior to midnight开头字母正中午 ...

  6. form常用表单标签

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. 用Open Live Writer写博体验

    感觉还蛮方便的--openlivewriter第一博!

  8. GUI的最终选择 Tkinter(六):Canvas组件

    Canvas组件,是一个可以让你任性的组件,一个可以让你随心所欲地绘制界面的组件.Canvas是一个通用的组件,它通常用于显示和编辑图形,可以用它来绘制直线,圆形,多边形,甚至是绘制其他组件. 在Ca ...

  9. rabbitmq 不发送ack消息如何处理:rabbitmq可靠发送的自动重试机制

    转载地址:http://www.jianshu.com/p/6579e48d18ae http://www.jianshu.com/p/4112d78a8753 接这篇 在上文中,主要实现了可靠模式的 ...

  10. java实现xml文件读取并保存到对象

    首先浅聊一下解析xml的四种方式: 1.DOM方式:有缺点但是这个缺点却也是他的优点.下面详细介绍: 以树形的层次结构组织节点或信息片断集合,可以获得同一个文档中的多处不同数据.使用起来简单. 优点是 ...