安卓——stackoverflow错误

4

遇到了StackOverflowError的问题。更糟糕的是,目前只在一个设备上出现。 我迄今为止已经测试过以下设备:

三星Galaxy SII(2.3.4)

三星Nexus S(4.0.3)

HTC Wildfire(2.3.7和2.2)

三星Galaxy Tab 10.1(3.2)

...而且一切正常。但是当我把应用程序发送给客户并让他在HTC Holiday 2.3.4上测试时,它会崩溃并显示这个错误:

java.lang.StackOverflowError
at android.widget.TextView.onDraw(TextView.java:4329)
at android.view.View.draw(View.java:6993)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.ViewGroup.drawChild(ViewGroup.java:1730)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:7105)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.widget.ScrollView.draw(ScrollView.java:1417)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.ViewGroup.drawChild(ViewGroup.java:1730)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.ViewGroup.drawChild(ViewGroup.java:1730)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.ViewGroup.drawChild(ViewGroup.java:1730)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.ViewGroup.drawChild(ViewGroup.java:1730)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.ViewGroup.drawChild(ViewGroup.java:1730)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.ViewGroup.drawChild(ViewGroup.java:1730)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.ViewGroup.drawChild(ViewGroup.java:1730)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2054)
at android.view.ViewRoot.draw(ViewRoot.java:1632)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1335)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1991)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:4358)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
at dalvik.system.NativeStart.main(Native Method)

有没有可能增加内存等来解决问题?该应用程序相当复杂,所有内容都在TabWidget上作为基本活动。错误发生在一个活动中,在那里我使用了滚动视图和动态添加视图,而不是使用listView。
更多细节:
1)我出错的地方是TabWidget,其中包含另一个具有两个意图的TabWidget。
哪种方式更好?使用内部嵌套的TabWidget还是只使用一个TabWidget和带有虚拟选项卡按钮的意图,并通过setContentView(...)设置内容。
2)在第一个意图中,我有两个滚动视图,第一个视图我动态添加了用户图片和相同的数据。当您点击用户时,会出现第二个ScrollView的动画效果,该视图也是通过更详细的用户数据动态填充的。所有视图都来自xml文件。
我使用ListView时没有遇到这个错误,没有动画效果,只需通过setContentView方法更改内容视图即可显示详细视图。我应该回到这种方法吗?
感谢任何帮助。
3)为什么只有一个设备出现此错误?不幸的是,这是客户设备,位于美国,我在英国,因此无法重现错误。

@goodm 你找到任何解决方案了吗? - Parag Chauhan
很遗憾,我没有这样做,我已经回到之前的工作设置了。 - goodm
3个回答

3

当存在太多递归调用时,通常会发生StackOverflowError错误,因此我建议您仔细检查每个可能会调用自身的方法,特别是那些导致它们调用自身不合理次数(几千次)或导致无法退出的情况(无限递归)的条件。

如果需要更详细的帮助,请发布错误日志和其他信息。


看起来你的布局嵌套过深,即使没有内存问题,我猜性能也不太好。最好先去除一些布局并检查是否解决了问题,如果是,则优化您的布局以减少嵌套。关于一些提示,您可以从这里开始:http://developer.android.com/resources/articles/layout-tricks-merge.html。 - Kai
很遗憾,我无法重现这个错误。它只在客户测试时出现。如果我能够重现这种错误,那将对我有更大的帮助。 - goodm
没有实际检查修改结果的能力,我只能建议您查看层次结构查看器(http://mobile.tutsplus.com/tutorials/android/android-tools-using-the-hierarchy-viewer/)和layoutopt(http://developer.android.com/guide/developing/debugging/debugging-ui.html#layoutopt),以改进您的视图层次结构,并希望这足以防止StackOverflowError。 - Kai
嘿,我正在实现同样的东西,并遇到了同样的问题,但我的问题出现在所有设备上,你是否成功解决了这个问题?如果已经解决,请在此处发布解决方法和修复方式。@goodm - user606669
3
实际上,我们需要关注三种类型的内存:1. 设备内存是所有进程共享的(196MB1GB),2. 虚拟机RAM可供每个进程使用(1648MB),3. 栈RAM(几百KB到最好几MB)。 - Kai
显示剩余2条评论

0

避免在选择页面时调用任何服务或方法,因为此方法会被递归调用多次,最终导致堆栈溢出错误。


0
有时候很难找到在一些堆栈大小较小的设备上出现的 StackOverflowError。您可以阅读一篇文章如何减少堆栈大小来了解更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接