记录: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
记录:Android中StackOverflow的问题的更多相关文章
- Android中StackOverflow的问题
最近出现了一个让人抓狂的问题. 现在的项目中,制作了一个界面非常复杂.Fragment中嵌套下拉刷新的Listview 这样一个布局,在3.0以上的手机上都表现良好问题!但是在2.x的比较弱爆的手机上 ...
- 在android中配置 slf4j + log4j 日志记录框架
需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j ...
- Android学习记录(6)—将java中的多线程下载移植到Android中(即多线程下载在Android中的使用)③
在这一节中,我们就来讲多线程下载以及断点续传在android中怎么使用,前两节是为本节做准备的,没有看前两节的同学,最好看完前面的两篇文章再来看这篇.其实在android端的应用和java基本上是差不 ...
- Android学习记录(3)—Android中ContentProvider的基本原理学习总结
一.ContentProvider简介 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据 ...
- Android学习记录(2)—Android中数据库的常见操作
android中数据库操作是非常常见了,我们会经常用到,操作的方法也有很多种形式,这里我就把最常见的两种形式记录下来了,以备以后用到方便查看.我就不写注释和解释了,因为android数据库的操作和其它 ...
- Android中的路径记录
Android中的路径记录 | RobinBlog 导航 导航 博客 分类 标签 友链 关于 搜索 Environment.getDataDirectory().getPath()=/dataEnvi ...
- Android学习记录(1)—Android中XML文件的序列化生成与解析
xml文件是非常常用的,在android中json和xml是非常常用的两种封装数据的形式,从服务器中获取数据也经常是这两种形式的,所以学会生成和解析xml和json是非常有用的,json相对来说是比较 ...
- HTTPS 原理浅析及其在 Android 中的使用
作者:曹丰斌 本文首先分析HTTP协议在安全性上的不足,进而阐述HTTPS实现安全通信的关键技术点和原理.然后通过抓包分析HTTPS协议的握手以及通信过程.最后总结一下自己在开发过程中遇到的HTT ...
- Kotlin 第二弹:Android 中 PDF 创建与渲染实践
这是 Kotlin 练习的的第二篇.这一篇的由来是因为刚刚在 Android 开发者官网查看 API 的时候,偶然看到了角落里面的 pdf 相关. 我仔细看看了详细文档,发现这个还蛮有意思的,关键是编 ...
随机推荐
- typescript项目配置路径别名(路径映射)
在vue项目中,我们可以利用“@”来指代src目录,在普通webpack项目中,我们也可以通过配置webpack的config来指定路径别名,但是在typescript+webpack项目中我们该怎么 ...
- Python的并发并行[4] -> 并发[1] -> concurrent.future 模块
concurrent.future 模块 1 thread模块 / thread Module 1.1 常量 / Constants Pass 1.2 函数 / Function Pass 1.3 类 ...
- poj3693(后缀数组)
poj3693 题意 给出一个串,求重复次数最多的连续重复子串,输出字典序最小的. 分析 论文 例8(P21). Sparse-Table算法预处理出任意两个后缀串的LCP. code #includ ...
- Python爬取中国天气网
Python爬取中国天气网 基于requests库制作的爬虫. 使用方法:打开终端输入 “python3 weather.py 北京(或你所在的城市)" 程序正常运行需要在同文件夹下加入一个 ...
- (转)NSString 类的使用
官网连接地址:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles/Creat ...
- SQL 连表更新
现在数据如下: 需求如下: 要求 更新 Earnings 表中的Earnings字段 当 Table_2 KPI 大于等于1时 Earinings = KPI* 2000,否则等于 KPI* 1500 ...
- c#作业(2班)
第二章 1.编写一个控制台程序,要求: 接受从控制台输入的姓名,如:张三 程序响应:你好,张三. 在代码中使用规范的注释,说明程序的功能 编译程序,并执行. 程序执行效果如下图: using Syst ...
- Android基于代理的插件化思路分析
前言 正常的App开发流程基本上是这样的:开发功能-->测试--->上线,上线后发现有大bug,紧急修复---->发新版本---->用户更新----->bug修复.从发现 ...
- 隐藏服务器真实IP的方法来防止DDOS攻击
2017-08-22 作者:小唐 点击: 10,500次 在无盘系统的环境下,服务器软件存在漏洞,就容易受到DDOS攻击,隐藏服务器真实IP是解决问题最好的方法,下面小编与大家分享一下隐藏服务器真实I ...
- git push后自动部署
前提,服务器已经装好ssh,本地也已经将ssh 公钥传到服务器对应位置 先用 pbcopy < ~/.ssh/PRIVATE_KEY.pub 将公钥复制到剪贴板:通过 ssh USER@SERV ...