最近新作的项目上线,出现了一个让人抓狂的问题。在此记录一下!
现在的项目中,制作了一个界面非常复杂。整个结构是最外层一个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
相关推荐
堆栈溢出 ...在此项目中,questions文件夹是带有的问题样本,如果要查找帖子,则应使用链接: https://stackoverflow.com/questions/<id> : https://stackoverflow.com/questions/<id> 。 执照 免费软件:
stackoverflow问题汇编_android Kindle阅读器格式,阅读时需下载相应阅读器
堆栈溢出 会为stackoverflow中的问题添加代码解决方案
Android Text Samples These samples show how to work with ...Stack Overflow: http://stackoverflow.com/questions/tagged/android-text If you've found an error in this sample, please file an issue: https://
NinjectAsyncInitializationByInterception 与相关的代码 根据您的要求,我发布了一个使用 ninject 的解决方案。 我稍微偏离了你的目标,因为构造函数没有执行初始化,而是一个方法。 该方法由拦截器调用。...
nexus3-scripting:帮助我们StackOverflow,您是我们唯一的希望!
StackOverflow答案我对stackoverflow的回答()重击相关答案
类似 Stackoverflow 的积分系统 3. 可提交文章用于知识库建设 4. 可设定只允许注册用户才能提问和回答 5. 简洁的 CSS 布局 6. 支持主流浏览器 安装方法: ----------------------------------------------- 1. ...
stacksort:通过从StackOverflow下载代码片段对数组进行排序。 受http://xkcd.com1185的启发。 抱歉
社区讨论平台-汇集了StackOverflow,Slack,Discourse,Reddit / HackerNews和Disqus博客评论的主要功能。 省时间。 人们在“问答”主题中“立即”找到帮助。 众包反馈和想法。 讨论,支持,选择正确的事情。 在...
emberoverflow-cli 这个 repo 是阅读 Ruslan Yakhyaev 的“雄心勃勃的 Ember 应用程序 - 综合 Ember.js 教程”并按照上述书中的说明构建应用程序的结果。 这本书的官方回购可以在找到。 可以在那里找到安装和运行...
用一个简单的界面替换常规的StackOverflow搜索,即可在互联网上搜索和浏览最大的代码片段集合:)用法 编写并选择问题描述,例如“ fizzbuzz实现”或“快速排序” 命中alt-s 查看并插入相关的StackOverflow代码段!...
堆栈溢出用于解析 StackOverflow XML 数据转储文件的 Go 库。 安装: go get -u github.com/kjk/stackoverflow 有关如何使用此库的示例,请参阅cmd/stats/main.go和cmd/tocsv/main.go 。 有助于解码格式的文档: ...
堆栈溢出问题在问题文件夹中是带有的项目,如果要查找该帖子,则应使用链接: https://stackoverflow.com/questions/<id> : https://stackoverflow.com/questions/<id> 。问题您只应报告此存储库中托管的代码有问题...
CrossSimpleAudioPlayerSample 关于在StackOverflow上有关在Xamarin.Forms应用程序中播放声音的问题的示例存储库 问题和答案在这里: :
适用于Stackoverflow核心功能的Python / Django RESTfull API 项目特色 问题 用标签创建新问题 更新特定问题 通过其所有答案和评论获得特定问题 列出所有问题 列出按标签过滤的所有问题 删除特定问题 答案 为特定...
StackOverFlowNewQuestionsToSlack 密切关注StackoverFlow上的特定问题并在Slack中得到通知该项目是在Azure Functions上创建的,它每天触发一次,并密切关注特定主题/公司/问题。 并更新为松弛计数,可以以多种方式...
个人项目项目 StackoverflowQA 该项目的目标是提取所有已回答的问题,并在主题下标记答案。 生成的输出是一个包含问题和答案的 pdf 文件,可用于快速... 使用 stackexchange api 2.2 版本从 Stackoverflow 获取数据。
StackOverflow储存库为StackOverflow新手实现了一些随机且有用的代码专案BMS 条形码读取器/写入器演示堆叠式
问题描述 https://stackoverflow.com/questions/44374790/ffmpeg-concat-protocol-error-found-duplicated-moov-atom-skipped-it https://stackoverflow.com/questions/42859528/merge-video-with-ffmpeg ffmpeg -y...