zoukankan      html  css  js  c++  java
  • 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

             以上见解纯属个人理解,欢迎大家多多指教,共同学习,共同进步!

  • 相关阅读:
    31天重构指南之二十:提取子类
    31天重构指南之二十二:分解方法
    大叔手记(17):大叔2011年读过的书及2012年即将要读的书
    深入理解JavaScript系列(5):强大的原型和原型链
    深入理解JavaScript系列(10):JavaScript核心(晋级高手必读篇)
    深入理解JavaScript系列(11):执行上下文(Execution Contexts)
    深入理解JavaScript系列(8):S.O.L.I.D五大原则之里氏替换原则LSP
    深入理解JavaScript系列(4):立即调用的函数表达式
    深入理解JavaScript系列(3):全面解析Module模式
    深入理解JavaScript系列(7):S.O.L.I.D五大原则之开闭原则OCP
  • 原文地址:https://www.cnblogs.com/wuyuxin/p/7002327.html
Copyright © 2011-2022 走看看