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

现在的项目中,制作了一个界面非常复杂。整个结构是最外层一个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. laravel-admin 使用记录(2) - 快速搭建 CURD
  2. [数学笔记Mathematical Notes]2-一个带对数的积分不等式
  3. idea 类注释,方法注释设置
  4. Java实现文件过滤
  5. 服务器安装centos6 linux,CentOS6.5安装详细教程,手把手教你安装Linux操作系统(CentOS6.5)...
  6. 14.1178亿人 流动人口超3亿 “大国普查”这些数据很重要
  7. mysql练习题练习
  8. 关于回复某个评论的功能小改进
  9. 欧洲冠军联赛决赛结束
  10. Picture Control控件图象保存为bmp,jpg,emf,tif,gif
  11. web入门--ssti
  12. 利用wget命令获取FTP资源
  13. MFC BMP设置Bitmap的分辨率DPI为600点 gdiplus 生成标签
  14. 分离开发中的laravel
  15. Project(9)——收货地址 -查看列表
  16. 红米Note3全网通开发版(MIUI10 8.11.22 安卓6)获取完整root权限
  17. 快速分析京东物流详情,并导出EXCEL表格
  18. 【实用算法教学】——Apriori算法,教你使用亲和性分析方法推荐电影
  19. 动态表头excel导入(java)
  20. c语言制作二元一次方程组的根,编程计算二元一次方程的根

热门文章

  1. 原生Js 两种方法实现页面关键字高亮显示
  2. Codeforces 552C Vanya and Scales(进制转换+思维)
  3. Android一个自定义的进度环:ProgressChart
  4. ThinkPHP 3.2.3 关联模型的使用
  5. Aptana插件安装到eclipse和myeclipse的详细过程
  6. 构建之法第11、12章
  7. SAP 那点事BW HANA
  8. No virtual method diskCacheStrategy
  9. Android 柱状图
  10. java 字符串数组转int数组_java怎么把字符型数组转换为int型?