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

 

         以上見解純屬個人理解,歡迎大家多多指教,共同學習,共同進步!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM