最近新作的项目上线,出现了一个让人抓狂的问题。在此记录一下!

现在的项目中,制作了一个界面非常复杂。整个结构是最外层一个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的问题相关推荐

  1. 简书 android bug记录,记录工作中的Bug

    整理了以前的笔记,把以前遇到的问题记录下来 1.App的首次安装. 问题描述:在我们安装完成一个app时,在安装界面直接点击打开.我们进入了app的首页,这时我们按home键返回桌面,再点击应用图标, ...

  2. Android中联系人和通话记录详解(2)

    在文章Android中联系人和通话记录详解(1)中对通话记录进行了分析,本章将对联系人的数据库表.字段以及Insert,Query,Delelte,Update四大基本数据操作进行分析. 与联系人相关 ...

  3. 【错误记录】Android 中使用 Kotlin 为 EditText 组件设置文本报错 ( Type mismatch. Required:Editable. Found:String )

    文章目录 一.报错信息 二.解决方案 一.报错信息 在 Android 中使用 Kotlin 开发 , EditText 组件如下 : 布局文件 : <EditTextandroid:id=&q ...

  4. android iphone 记事本,iPhone上有哪些记事本软件足够你记录生活中的细节?

    iPhone上有哪些记事本软件足够你记录生活中的细节?一款好用的记事本软件应具备启动快.快速添加笔记.运行流畅等元素,所以笔者搜罗了一些优秀的记事本APP,不仅可能实现这些基本要求,还有诸如云同步.跨 ...

  5. Android中处理崩溃异常

    2019独角兽企业重金招聘Python工程师标准>>> 大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象 ...

  6. Android中的JSON详细总结

    1.JSON(JavaScript Object Notation) 定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式, ...

  7. Android中的那些权限

    随着智能手机的普及,越来越多各式各样的应用和服务出现在手机平台上.这些应用和服务要访问手机上的 资源,就牵涉到权限问题.手机又是一个非常敏感的平台,涉及到用户的很多个人信息,隐私等等,在这种背景 下权 ...

  8. Android 中的安全机制

    1 Android 安全机制概述 Android 是一个权限分离的系统 . 这是利用 Linux 已有的权限管理机制,通过为每一个 Application 分配不同的 uid 和 gid , 从而使得 ...

  9. android 增加一条广播,Android中BroadcastReceiver广播使用及注意点

    Android中的广播用途很广,是四大组件之一.在android中可以看到它的各种应用,从系统发出的广播,用户自定义的广播等. 这里详细记录下广播的分类以及使用方法. 广播,是由两方面组成一个流程:广 ...

最新文章

  1. aes算法的C语言实现代码,AES加密算法c语言实现代码
  2. 实时个性化推荐系统简述
  3. springcloud ribbon retryTemplate操作流程分析
  4. 组合模式测试组合模式(Composite Pattern)
  5. T-SQL 实用函数总结
  6. 肖仰华 | 知识图谱与认知智能
  7. servlet3.1
  8. 洛谷 P1356 数列的整数性 解题报告
  9. Windows Store App 音频和视频
  10. python音乐播放器代码_Python简易音乐播放器
  11. 语音计算机怎么切换音乐模式,怎么实现一个设备播放一个程序的声音呢?
  12. canvas 绘画
  13. c语言从键盘输入圆柱体的半径和高,c 写程序:输入圆柱的半径和高,计算并输出圆柱体的体积和表面积...
  14. java 绘制动态的图形
  15. YouCompleteMe + Ale异步检测语法
  16. 细雨算法升级,针对B2B领域低质内容
  17. MTK之Flash篇一
  18. 配置 Rails 应用程序
  19. 如何利用校园邮箱免费使用IDEA
  20. 去金坛长荡湖吃船菜,原来1947年就有前辈在努力发展中国的计算机产业

热门文章

  1. Rstudio调用plot()函数时,出现错误的处理方法
  2. iptables原理及规则
  3. 小程序的wx.onAccelerometerChange
  4. MyBatis:事务回滚
  5. java web 多语言_基于 Selenium WebDriver 实现多语言环境下自动化截图
  6. idea的plugins无法使用marketplace plugins are not loaded
  7. niceyoo的2020年终总结-2021年Flag
  8. 怎样在php中使用PDF文档功能
  9. node process.env.NODE_ENV 使用 cross-env 配置 设置
  10. jJMeter UDP Request:不等待服务器响应