日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

记录:Android中StackOverflow的问题

發布時間:2023/12/10 Android 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 记录: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的棧空間。大概最多只會有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的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。