【问题标题】:Stackoverflow: Caused by nested views?Stackoverflow:由嵌套视图引起?
【发布时间】:2012-03-31 04:59:59
【问题描述】:

刷新 SlidingTray 中的视图时发生崩溃(自定义 SlidingDrawer 来自顶部)。

我不确定是什么原因造成的。但我的第一个猜测是这是由于嵌套布局的数量...

嵌套布局的最大数量是多少?

它是特定于设备的吗,我如何确定是否是这个原因?

如果不是,这些原因中的任何一个都会导致它.. 是什么?

堆栈跟踪:

E/AndroidRuntime( 2199): FATAL EXCEPTION: main
E/AndroidRuntime( 2199): java.lang.StackOverflowError
E/AndroidRuntime( 2199): at android.graphics.Paint.measureText(Paint.java:1057)
E/AndroidRuntime( 2199): at android.text.Styled.drawDirectionalRun(Styled.java:267)
E/AndroidRuntime( 2199): at android.text.Styled.measureText(Styled.java:430)
E/AndroidRuntime( 2199): at android.text.Layout.measureText(Layout.java:1655)
E/AndroidRuntime( 2199): at android.text.Layout.getLineMax(Layout.java:689)
E/AndroidRuntime( 2199): at android.text.Layout.draw(Layout.java:340)
E/AndroidRuntime( 2199): at android.text.BoringLayout.draw(BoringLayout.java:365)
E/AndroidRuntime( 2199): at android.widget.TextView.onDraw(TextView.java:4168)
E/AndroidRuntime( 2199): at android.view.View.draw(View.java:6880)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.View.draw(View.java:6883)
E/AndroidRuntime( 2199): at android.widget.FrameLayout.draw(FrameLayout.java:357)
E/AndroidRuntime( 2199): at android.widget.ScrollView.draw(ScrollView.java:1409)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.View.draw(View.java:6883)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.View.buildDrawingCache(View.java:6640)
E/AndroidRuntime( 2199): at android.view.View.getDrawingCache(View.java:6428)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1571)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1392)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.View.draw(View.java:6883)
E/AndroidRuntime( 2199): at android.widget.FrameLayout.draw(FrameLayout.java:357)
E/AndroidRuntime( 2199): at android.widget.ScrollView.draw(ScrollView.java:1409)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.View.draw(View.java:6986)
E/AndroidRuntime( 2199): at android.widget.FrameLayout.draw(FrameLayout.java:357)
E/AndroidRuntime( 2199): at android.widget.HorizontalScrollView.draw(HorizontalScrollView.java:1409)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.View.draw(View.java:6883)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.View.draw(View.java:6883)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
E/AndroidRuntime( 2199): at com.vodafone.onm.components.SlidingTray.dispatchDraw(SlidingTray.java:426)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.View.draw(View.java:6883)
E/AndroidRuntime( 2199): at android.widget.FrameLayout.draw(FrameLayout.java:357)
E/AndroidRuntime( 2199): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
E/AndroidRuntime( 2199): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
E/AndroidRuntime( 2199): at android.view.View.draw(View.java:6883)
E/AndroidRuntime( 2199): at android.widget.FrameLayout.draw(FrameLayout.java:357)
E/AndroidRuntime( 2199): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java)

更新层次结构查看器快照

.

有些我认为是相关的: http://www.mail-archive.com/android-developers@googlegroups.com/msg48036.html

【问题讨论】:

  • 请为 createView 或您正在做的任何事情发布一些代码
  • 代码太多 :-S ,但是它的层次结构查看器快照怎么样?
  • 只要确保在回收/绘图时不会以某种方式导致递归调用。如果你不是那么太多的嵌套视图可能是问题所在。至于限制,这取决于堆栈大小,我认为这取决于固件。
  • 问题是我有一个带有拉动刷新的SlidingDrawer/Tray,带有几个页面的水平滚动,每个页面都有垂直滚动视图,有4个大按钮,每个按钮都有自己的滚动视图......里面的数据……
  • 圣烟。所以(有点技术性),这看起来有点古怪。有几个非常可靠的视图,只有一个孩子,应该可以通过 或其他东西折叠。此外,您正在做的一些事情听起来很可怕,您应该查看 ViewPager 或其他东西并重新考虑您的布局

标签: android layout stack-overflow


【解决方案1】:

嵌套布局的最大数量是多少?

没有具体的价值。当您用完堆栈空间时,您就用完了堆栈空间,这取决于您正在做什么。主应用线程有一个 8KB 堆栈,我上次听说的。

话虽如此,如果 Hierarchy View 显示的深度为 10 或更多(从根到最深的叶子),我开始感到紧张,到 15 时您可能会开始遇到异常。您的图像几乎难以辨认,但其深度似乎远高于此值。

您似乎有许多浪费的层。如果您在层次结构视图中有一个层,在关键路径上,它有一个父节点和一个子节点,这是要删除的主要候选者,因为它可能不会增加任何价值。您至少有 5 个这样的候选人。即使清理所有这些可能还不够,但这是一个起点。

【讨论】:

  • 谢谢,我正在尝试减少到​​ 15(删除一些功能)。完成后我会回来测试它。
  • 成功了。有 17 层深度,它可以在没有崩溃的情况下工作。但我也想知道我删除的其中一件事是否也有助于解决崩溃问题。我使用 view.layout(...) 来移动视图以模拟 ScrollView(使用滚动视图创建 Pull to Refresh 会非常复杂)。如果这与移动屏幕的刷新一起也会导致这样的崩溃,您是否有任何线索?
  • @NeTeInStEiN:我不知道,抱歉。
  • @CommonsWare 我遇到了类似的问题,我遇到了 stackoverflow 错误正如您所说 如果您在层次视图中有一个层,在关键路径上,它有一个父级和一个子级,即要删除的主要候选人,因为它可能不会增加任何价值。你能解释一下吗?我认为我的问题是因为这个。我包括一种布局,即TableLayout,它只有一个TableRow,有六张图片。你能详细说明一下吗?
  • @BBdev:“我包含一个布局,它是 TableLayout,它只有一个 TableRow 和六个图像。请您详细说明一下。” -- 用水平的LinearLayout 替换它。单行 TableLayout 没有任何价值。
猜你喜欢
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 2020-01-01
相关资源
最近更新 更多