记录:Android中StackOverflow的问题
? ? ? 最近新作的項目上線,出現了一個讓人抓狂的問題。在此記錄一下!
?
? ? ? 現在的項目中,制作了一個界面非常復雜。整個結構是最外層一個Layout,封裝了Menu鍵吊起的菜單,整個內容使用一個FrameLayout裝載,這個layout中會有三個V4 Fragment。一個主Fragment和兩個彈出的Fragment。主Fragment中分上中下結構,上部分展示圖片,中部展示信息,下部分是一個可滑動的帶4個Tab的ViewPager,這個ViewPager包在一個TabHost里面。整個嵌套的結構由于各種原因,達到了15層,并且在最里面的ViewPager中有兩個View里面帶了ListView,Item已經用RelativeLayout打平為一層。
?
? ? ? 這樣一個布局,在3.0以上的手機上都表現良好問題!但是在2.x的手機上會出現
? ? ? ?Android 2.3 I'm getting a StackOverflowError when the layout is drawn:
? ? ? ?at android.view.View.draw(View.java:6880)
? ? ? ?at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
? ? ? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
? ? ? ?at android.view.View.draw(View.java:6883)
? ? ? at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
? ? ? at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
? ? ? ...
? ? ? 棧溢出問題。各種谷歌之后發現,很多人在2.x上也會有這個問題,究其原因就是View的層次嵌套過多,而2.x上Android給UI主線程分配了大概8KB的??臻g。大概最多只會有60到80層的stack frame。這個空間存儲不了我的這個布局,后分析發現,由于最里層嵌套了Listview ,每個Item都有很深,而且每個Item在不斷的進行著重繪。最終導致了2.x機型的棧溢出問題。
?
? ? ? 大部分的方法就是優化布局,減少嵌套。
? ? ? 和網上說的一樣,接下來就是不斷的優化,能減極簡。但是到最后優化到評論的listview的層次大概為16層,在部分的android 2.x上依舊報這個問題。如果要繼續優化下去,就得去掉fragment。因為在觀看布局時發現,v4包的fragment會在最外層添加一個NosavestateFramelayout。而我用到的是Fragment中嵌套了Fragment,這就導致平白無故多了兩層。如果要保持我現在的布局就得考慮去掉Fragment,全部改用View。但是項目緊張,根本來不及切換過來。于是只能進行降級。
? ? ? 當然還有一些比較不太優雅的解決方式:
? ? ? 比如在你最深層次容易爆崩潰的View中,把所有的View都重寫Draw方法
?
? ? ? ?privateHandler mHandler =newHandler();
@Overridepublicvoid draw(Canvas canvas){try{super.draw(canvas);}catch(StackOverflowError e){ mHandler.postDelayed(newRunnable(){publicvoid run(){ invalidate();}},1);}}? ? ? ? 雖然最好的方法仍然是去優化你的布局,解嵌套,不僅能加快頁面渲染速度,還能解決此問題。但是實在是沒有任何可優化的時候,只能先使用這種比較臟的方式。我最后使用的是進行了降級,因為項目緊張,而且不容有失,所以降級成了最保險的選擇。對于2.x系統這種強加的限制,表示真的是太蛋疼了!
?
? ? ? ?The stack size of UI thread in Android 2.x is 12KB and in Android 4.x is 16KB. These 4KB make all the difference - since the above layout crashes on 2.x with StackOverflow.
?
? ? ? 對于嵌套過深的地方,尤其當有listview時,一定要注意,能去fragment就去掉fragment!盡量直接換用ViewGroup
轉載于:https://www.cnblogs.com/xgjblog/p/4268264.html
總結
以上是生活随笔為你收集整理的记录:Android中StackOverflow的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MAC 下shell工具推荐 zente
- 下一篇: 我想自学Linux,需要从哪些方面学起