1.java.lang.StackOverflowError
出现这个问题是因为布局的层级嵌套太深。但也要分两种情况:
1.初次渲染绘制的时候出现
是在setContentView(R.layout.activity_main);的时候出现的。这种没什么说的,分析布局减少布局层级就可以了。网上也有很多博客去介绍。
2.初次渲染没有问题,页面也能对用户可见,但是页面会获取网络数据,网络数据回来后页面展示数据时出现此错误。那我们就需要注意:
1)像1情况一样,用于展示数据的布局是否层级过深?
2)是否调用了过多次的setVisibility(View.GONE);导致页面重绘。
扩展:
1.在android中是Dalvik JVM控制着主线程中栈的大小。而这个大小值在dalvik/vm/Thread.h中的#define kDefaultStackSize变量中也有定义。
API 3 (Android 1.5) = 8KB
API 4-10 (Android 1.6 - Android 2.3.7) = 12KB
API 14-17 (Android 4.0 - Android 4.2.2) = 16KB
android 4.4 32KB
我们应该每个页面有多少个布局层级?
这个是没有确定数据的,虽然栈的大小有固定值。但它完全取决于渲染到最深层级需要调用多少次方法以及这些方法中的变量。试验证明,栈内存溢出的完全可能出现在任何组合足够深的布局上。当然,知道渲染时的系统原理对于优化页面渲染是有帮助的。要知道,多一层布局嵌套,就会多出draw() -> dispatchDraw() -> drawChild()这三个方法,栈内存就会被吃掉一部分。
更多内容可以参考:在 Android Runtime (ART) 上验证应用行为
翻译自:What is the android UI thread stack size limit and how to overcome it?
2.还有什么情况会导致这个问题呢?
不正确的生命周期声明与错误的Intent
通常由standard 发射级别的Activity互相调用引起,栈内积累了过多的Activity,解决方式是重新考虑Activity发射级别的设置,或者使用flag来控制