問題: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
以上見解純屬個人理解,歡迎大家多多指教,共同學習,共同進步!