Android中的StackOverflow错误



我在宏碁平板电脑上运行我的应用程序,应用程序每次都会崩溃,并且应用程序在三星平板电脑上完美运行。

02-13 09:48:05.400: D/OpenGLRenderer(7270): Flushing caches (mode 0)
02-13 09:48:07.700: D/dalvikvm(7270): GC_CONCURRENT freed 13419K, 65% free 7568K/21063K, paused 2ms+4ms
02-13 09:48:07.830: I/dalvikvm(7270): threadid=1: stack overflow on call to Landroid/widget/TextView;.onCreateDrawableState:LI
02-13 09:48:07.830: I/dalvikvm(7270):   method requires 36+20+20=76 bytes, fp is 0x4001732c (44 left)
02-13 09:48:07.830: I/dalvikvm(7270):   expanding stack end (0x40017300 to 0x40017000)
02-13 09:48:07.830: I/dalvikvm(7270): Shrank stack (to 0x40017300, curFrame is 0x40017500)
02-13 09:48:07.830: D/AndroidRuntime(7270): Shutting down VM
02-13 09:48:07.830: W/dalvikvm(7270): threadid=1: thread exiting with uncaught exception (group=0x40a561f8)
02-13 09:48:07.860: E/AndroidRuntime(7270): FATAL EXCEPTION: main
02-13 09:48:07.860: E/AndroidRuntime(7270): java.lang.StackOverflowError
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.View.getDrawableState(View.java:11556)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.widget.TextView.onDraw(TextView.java:4863)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.View.draw(View.java:10983)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.View.getDisplayList(View.java:10422)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.View.draw(View.java:10986)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.View.getDisplayList(View.java:10422)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.View.getDisplayList(View.java:10420)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.View.getDisplayList(View.java:10420)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.View.getDisplayList(View.java:10420)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.View.draw(View.java:10986)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.widget.FrameLayout.draw(FrameLayout.java:450)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.widget.ScrollView.draw(ScrollView.java:1524)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.View.getDisplayList(View.java:10422)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.View.draw(View.java:10986)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.widget.FrameLayout.draw(FrameLayout.java:450)
02-13 09:48:07.860: E/AndroidRuntime(7270):     at android.view.View.getDisplayList(View.java:10422)

请帮助我如何解决此问题

StackOverflowError the depth of the stack of the running program exceeds some platform or VM specific limit时抛出。通常,这只会在程序变得无限递归时发生,但它也可能发生在正确编写(但深度递归)的程序中。

也许您的嵌套布局太多。

StackOverflowError 发生在视图内有两个视图(即嵌套视图)时,就像你有 15 层深一样。

如何解决:

这并不容易,您只需要删除嵌套视图(布局)。因此,尽量使用相对布局。

重现堆栈溢出错误:

StackOverflowError最烦人的事情是,我不会在所有设备上发生。旧设备(内存较少,CPU 功率较低)会出现此错误,但高端设备可能不会产生此错误。因此,产生/解决此问题的最佳方法是在不同的模拟器上对其进行测试。

通常,

只要嵌套视图组过多,而这些视图组位于另一个视图组内,就会发生StackOverflowError。我认为在您的布局中保留了太多视图并递归调用,这是递归地相互调用并导致超出特定限制的堆内存。

只需使用HierarchyViewer检查您的布局,这将向您显示您如何设计布局。

最新更新