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