仅限Android 2.3.3设备上的Stackoverflow

时间:2013-11-04 10:03:06

标签: java android stack-overflow android-sdk-2.3

我一直在Native Android App工作,我在Android 2.3.3 versions and below Android 3.0 version面临一些错误。

我没有得到我的代码究竟在哪里,因为在Logcat编译的每一行代码但最后得到的是非常奇怪的错误描述日志如下:

java.lang.StackOverflowError
at java.util.concurrent.locks.ReentrantLock$NonfairSync.tryAcquire(ReentrantLock.java:189)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1171)
at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185)
at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261)
at java.util.concurrent.CopyOnWriteArrayList.removeRange(CopyOnWriteArrayList.java:569)
at java.util.concurrent.CopyOnWriteArrayList.remove(CopyOnWriteArrayList.java:366)
at java.util.concurrent.CopyOnWriteArrayList.remove(CopyOnWriteArrayList.java:376)
at android.view.ViewTreeObserver.removeOnPreDrawListener(ViewTreeObserver.java:377)

at android.widget.TextView.onDraw(TextView.java:4085)
at android.view.View.draw(View.java:6986)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.View.draw(View.java:6989)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.View.draw(View.java:6989)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.ViewGroup.drawChild(ViewGroup.java:1737)

    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.View.draw(View.java:6989)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.View.draw(View.java:6989)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.View.draw(View.java:6989)
at android.widget.FrameLayout.draw(FrameLayout.java:361)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)

    at android.view.View.draw(View.java:6989)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.View.draw(View.java:6989)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.View.draw(View.java:7093)
at android.widget.FrameLayout.draw(FrameLayout.java:361)
at android.widget.ScrollView.draw(ScrollView.java:1421)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.ViewGroup.drawChild(ViewGroup.java:1737)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.View.draw(View.java:6989)
at android.widget.FrameLayout.draw(FrameLayout.java:361)
at android.view.ViewGroup.drawChild(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466)
at android.view.ViewGroup.d

当我检查我的代码时,我发现没有stackoverflow的跟踪。当我在Android 3.0或更高版本上运行相同的代码时,它运行有效且正确但不在Android 2.3.3&低于3.0版本。 如果有人知道这个问题,请告诉我吗?

[编辑]我正在使用Tab活动,因此主要布局为Main.xml,并且该子活动包含名为firstTab_Results.xml的视图,它包含一个表格布局,确实执行了{{{ 3}}布局。

[编辑2]无论如何我都没有递归它,它将Max 20个视图(inflate_table_firstTab.xml)扩展到表格布局(firstTab_Results.xml)。

Note : Stackoverflow happens on single or dual core processor devices & without fullscreen mode .

5 个答案:

答案 0 :(得分:19)

您的视图层次结构太深。当递归地绘制层次结构时,您将耗尽堆栈空间,并且不能在层次结构中更深入,如堆栈跟踪中所观察到的那样。

为什么这只发生在早期设备中是因为Android 2.3设备中的UI线程堆栈大小仅为12kB,而后续OS版本中的16kB(ref)。

如何减少视图层次深度?尽可能避免嵌套布局。您发布的布局过于复杂,在此Stack Overflow模型中无需为您修复它们(正确执行需要一些时间,而且可能太具体而无法帮助其他人),但这里有一些通用指南:

  • 删除不必要的布局。例如,在firsttab_results.xml中,您只需要TableLayout,顶部的RelativeLayoutLinearLayout几乎没用。在ScrollView中,当一个或最多两个可能就足够时,至少有6个嵌套布局。

  • 布局中的单个孩子是代码气味。大多数情况下,可以将子项移动到其父布局并使用边距调整布局。

  • 通常很少需要在RelativeLayout内放置布局。相对布局在使用相对定位和子基线对齐来布置其子项时非常有用。

  • 如果您只需要background的嵌套布局,请尝试将背景移动到例如View。只是一个与嵌套布局大小相同的{{1}},并在其上面布置其他元素。

  • 注意Android Lint警告。该工具已经非常擅长检测可以简化的视图层次结构复杂性。

答案 1 :(得分:5)

您有嵌套的视图层次结构,您可以在android中使用hierarchyViewer 查看您的视图层次结构。如果你的应用程序中有许多嵌套视图,那么那些内存较小的设备会产生异常,而其他设备则运行良好。平滑你的视图。使用 RelativeLayout 来平展视图。

答案 2 :(得分:1)

我不认为您因为“嵌套”您的观点而看到了您的错误。我认为这可能是一个问题,使用早期设备在他们的库中无法访问的东西,你的ide没有捕获它或你有lint警告而忽略它们。尝试查看你的lint警告,看看是否有任何关于某些视图或早期版本中没有api的提及。

答案 3 :(得分:1)

Android上的堆栈限制为8K,即使至少拥有2GB RAM的三星Galaxy S3也是如此。我不知道它是否因设备而异。我不知道为什么,我asked and they closed my question

你的Main.xml是非常嵌套的,无论代码使用它都可能导致堆栈溢出。每个嵌套级别使用的堆栈数量取决于实现,这就是它在一个版本而不是另一个版本上发生的原因。一个版本可以调用5个函数链,然后处理嵌套XML的下一级,依此类推,其中一个可以链20个。

答案 4 :(得分:0)

您是否使用递归来构建视图层次结构? StackOverflowError没有递归。