仅限Android 2.3.3设备上的Stackoverflow

Riz*_*van 14 java stack-overflow android 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
Run Code Online (Sandbox Code Playgroud)

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

[编辑]我正在使用Tab活动,因此主要布局是Main.xml,并且该子活动包含名为firstTab_Results.xml的视图,它包含一个表布局,它确实执行inflate_table_firstTab.xml布局的最多20个视图的膨胀.

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

Note : Stackoverflow happens on single or dual core processor devices & without fullscreen mode .
Run Code Online (Sandbox Code Playgroud)

laa*_*lto 19

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

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

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

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

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

  • 通常没有必要在布局内部放置布局RelativeLayout.相对布局在使用相对定位和子基线对齐来布置其子项时非常有用.

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

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


Har*_*dik 5

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

  • 你会在这里找到更多信息http://developer.android.com/training/improving-layouts/optimizing-layout.html (3认同)
  • 我怎么知道我应该平坦地将任何布局压平到相对布局.请在这里详细说明一下. (2认同)