记录: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenDrive记录

1. junction里面只有一半的链接关系,也就是只有road进入junction的链接关系,没有junction出 去的链接关系。 拿路径搜索方法举例, 1) 如果当前road的前方是junction,即当前road的predecessor或者successor是juncti…

JavaWeb高性能开发(一)

今日要闻: 淘宝删差评产业链 在你给出“差评”“中评”后不久,有人会偷偷登录你的淘宝账户,把你之前给过的评价删除或改成“好评”。而这种人就是“职业修改差评师” 案发前,李骏杰在杭州市滨江区一家科技公司上班。5 人当中,他主…

凸多边形的面积问题

Q&#xff1a;给定顶点坐标&#xff0c;求凸多边形的面积&#xff0c;保留两位小数。 样例输入&#xff1a; 4 3 3 3 0 1 2 1 0 样例输出 5.00 S&#xff1a; #include<stdio.h> #include<math.h> #include<stdlib.h> double dist(struct point A,struct poi…

从此明白了卷积神经网络(CNN)

卷积神经网络是一种曾经让我无论如何也无法弄明白的东西&#xff0c;主要是名字就太“高级”了&#xff0c;网上的各种各样的文章来介绍“什么是卷积”尤为让人受不了。听了吴恩达的网课之后&#xff0c;豁然开朗&#xff0c;终于搞明白了这个东西是什么和为什么。我这里大概会…

Linux 输入子系统原理理解(原创)

linux 输入子系统原理理解&#xff08;原创&#xff09; 以前学了单独的按键设备驱动以及鼠标驱动&#xff0c;实际上&#xff0c;在linux中实现这些设备驱动&#xff0c;有一种更为推荐的方法&#xff0c;就是input输入子系统。平常我们的按键&#xff0c;触摸屏&#xff0…

Logistic Regression:最基础的神经网络

一、什么是logictic regression 下面的图是Andrew Ng提供的一个用logistic regression来识别主子的图片的算法结构示意图&#xff1a; 「左边」的「x0到x12287「是输入&#xff08;input&#xff09;&#xff0c;我们称之为」特征&#xff08;feather&#xff09;」&#xff0…

Win7和Ubuntu14.10双系统

一、Wubi 本来是拿wubi安装的。步骤简单&#xff0c;装卸方便。就是失败了。。。 下载好镜像后解压一份&#xff0c;将wubi.exe复制出一份放在和镜像同目录下&#xff08;目录要全英&#xff09;。断网&#xff0c;运行wubi.exe按照提示安装。这里这篇教程挺好&#xff0c;之后…

LateX 笔记

y \frac{a}{b} y A_aA_{bb} y a\times{b} y \arctan{(x)} \pi y x^2

OpenDrive ARC绘制秘籍

加和减代表曲率的正负

mysql中char与varchar的区别分析

原文网址&#xff1a;http://www.jb51.net/article/23575.htm mysql中char与varchar的区别分析 作者&#xff1a; 字体&#xff1a;[增加 减小] 类型&#xff1a;转载在mysql教程中char与varchar的区别呢&#xff0c;都是用来存储字符串的&#xff0c;只是他们的保存方式不一样…

3W+字的设计模式手册

设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结&#xff0c;其中最出名的当属 Gang of Four (GoF) 的分类了&#xff0c;他们将设计模式分类为 23 种经典的模式&#xff0c;根据用途我们又可以分为三大类&#xff0c;分别为创建型模式、结构型模式和行为型模式。…

datagridview 当前上下文中不存在bind_全面解析JavaScript中this指向问题

this指向参考文章&#xff1a;* thisJavaScript中this指向分为以下几种情况&#xff1a;普通函数或作为对象属性事件绑定构造函数箭头函数call/apply/bind指定下面我们来进行一一介绍普通函数或作为对象属性this取决于方法执行前面是否有“点”&#xff0c;有“点”的话&#x…

Unity Scene为每一个游戏物体进行扩展编辑

2个月前还在忙碌的找实习工作,看见招聘信息上面有一条熟悉扩展Unity编辑器,配合美工编程. 自己动手写完这个代码时候,发现写代码就像弹钢琴多么神奇. TestEdit类: using UnityEngine; using System.Collections; using UnityEditor;[CustomEditor(typeof(Test))] public class …

esmini LongSpeedAction修改

esmini的LongSpeedAction&#xff0c;如果shape设置为step的话&#xff0c;DynamicsDimension实际就无效了&#xff0c; 因为step的意思就是直接设置&#xff0c;在LongSpeedAction的Start过程中设置完就结束了&#xff0c;Step就不在 执行。 如果我们在step的情况下&#x…

cc2530i2c可同时接受两个传感器的数据吗_汽车方向及维修_玉树沃尔沃S40方向机,宝马531电子方向机进水可以维修吗...

产品品牌&#xff1a;徐州永诚汽车方向及维修公司产品单价&#xff1a;最小起订&#xff1a;23供货总量&#xff1a;2交货期限&#xff1a;13发货城市&#xff1a;徐州玉树沃尔沃S40方向机,宝马531电子方向机进水可以维修吗 [qadxfh3k]凭以往的经验&#xff0c;像这种多个控制模…

Android项目实战视频教程_快递轨迹查询应用开发

基于Android平台的快递轨迹查询应用开发全程实录&#xff08;MenuDrawer、DbUtils、HttpUtils、讯飞语音识别&#xff09;课程分类&#xff1a;Android适合人群&#xff1a;中级课时数量&#xff1a;10(17节)课时用到技术&#xff1a;MenuDrawer、DbUtils、HttpUtils、讯飞语音…

OpenXLSX 字段读取问题

在读取excel的时候发现有些字段无法读取&#xff0c;通过把excel文件解压后对比发现&#xff0c;正常读取和不 能正常读取的字段在sharedString.xml中存储的格式有差异&#xff0c;取其中一个字段&#xff0c;如下图&#xff1a; 正常读取的 不能读取的 对比可以看到其区别&a…

六西格玛dfss_六西格玛系列知识之二:六西格玛管理的基本原理

六西格玛管理是一系统&#xff0c;其系统性体现在它既提出了面向产品和服务设计开发的六西格玛设计&#xff0c;又提出了面向流程、产品制造、服务提供的六西格玛改进方法。从当前的情况来看&#xff0c;六西格玛设计&#xff08;DFSS&#xff09;项目推进尚未形成统一的或得到…

XCode5.1.1怎样实现代码块自己主动排版

1.问题描写叙述 在开发中常常遇到代码块须要排版的情况&#xff0c;假设一行一行缩进就太out了&#xff0c;但在xcode中怎样实现还真不知道2.解决方法 2.1选中须要排版的代码块 2.2单击"Editor | Structure | Re-Indent"菜单项 2.3看看是不是已经得到想要的结果了&am…