仅限Android 2.3.3设备上的Stackoverflow

我一直在努力在本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的视图,它拥有一个表格布局,确实执行inflate_table_firstTab.xml布局的最大20个视图的充气 。

[编辑2]无论如何,我不会recursion它,最多20个视图(inflate_table_firstTab.xml)充气到表格布局(firstTab_Results.xml)。

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

Solutions Collecting From Web of "仅限Android 2.3.3设备上的Stackoverflow"

您的视图层次太深。 当recursion地绘制层次结构时,堆栈空间不足,无法在层次结构中进行更深层次的操作(如堆栈跟踪中所示)。

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

如何减less视图层次深度? 尽可能避免嵌套布局。 你发布的布局太复杂了,在这个Stack Overflow模型中没有一点要解决这个问题(这需要一些时间来正确地做,而且可能太专门帮助别人),但是这里有一些一般的指导原则:

  • 删除不必要的布局。 例如,在您的firsttab_results.xml中,您只需要TableLayout ,而上面的RelativeLayoutLinearLayout几乎没有用处。 在你的ScrollView中,至less有6个嵌套的布局,当一个或最多两个可能是足够的。

  • 布局中的一个孩子是一种代码味道。 大多数情况下,可以实现同样的目标,将孩子转移到父母的布局,并利用空白来调整布局。

  • 通常很less需要将布局放在RelativeLayout 。 相对布局在使用相对定位和儿童基线alignment来布置其子女方面是强大的。

  • 如果你只需要一个嵌套的布局,试着将背景移动到例如一个与嵌套布局大小相同的View ,并在其上面放置其他元素。

  • 请注意Android Lint警告。 该工具已经变得相当擅长检测视图层次结构的复杂性,可以简化。

你有嵌套的视图层次结构,你可以在android中使用hierarchyViewer来查看你的视图层次结构 。 如果你的应用中有很多嵌套的视图,那么那些有小内存的设备会给予exception,而其他设备则可以很好地运行。 使用RelativeLayout来平整视图。

我不认为你看到你的错误,因为“嵌套”你的意见。 我认为这可能是一个问题,使用早期的设备不能访问他们的图书馆,你的ide没有赶上它,或者你有纤细的警告,并忽略它们。 尝试看看你的皮棉警告,看看它是否提到了某些视图或API在早期版本中不可用。

Android上的堆栈限制为8K,即使是至less具有2GB RAM的Samsung Galaxy S3也是如此。 我不知道是否因设备而异。 我不知道为什么,我问,他们closures了我的问题 。

你的Main.xml是非常嵌套的,无论代码如何使用,都可能导致堆栈溢出。 每层嵌套使用的堆栈数量与实现有关,这就是为什么它发生在一个版本上,而不是另一个版本。 一个版本可能会调用5个函数的链,然后处理嵌套的XML的下一个级别,依此类推,一个可能链20。

你使用recursion来build立你的视图层次? 我几乎从来没有看到一个StackOverflowError没有recursion。