Android的ActionBarSherlock导致堆栈溢出错误

Android的ActionBarSherlock导致堆栈溢出错误,android,actionbarsherlock,Android,Actionbarsherlock,我将ActionBarSherlock集成到我的Android应用程序中。它基本上运行良好,但有一个严重的例外 当专门在API级别10(对应于Android 2.3.3)上运行并且仅在该版本上运行时,当用户在两个特定活动之间导航时,StackOverflowerError(如下所示)会在某个点发生。调用堆栈显示,此错误完全发生在Android框架内,与我的自定义代码无关 我知道它与ActionBarSherlock相关的唯一原因是,如果我将更改还原到活动类,以便它们再次从标准活动基类而不是She

我将ActionBarSherlock集成到我的Android应用程序中。它基本上运行良好,但有一个严重的例外

当专门在API级别10(对应于Android 2.3.3)上运行并且仅在该版本上运行时,当用户在两个特定活动之间导航时,StackOverflowerError(如下所示)会在某个点发生。调用堆栈显示,此错误完全发生在Android框架内,与我的自定义代码无关

我知道它与ActionBarSherlock相关的唯一原因是,如果我将更改还原到活动类,以便它们再次从标准活动基类而不是SherlockActivity继承,并还原到非Sherlock主题,则不会发生错误

FATAL EXCEPTION: main
java.lang.StackOverflowError
at com.android.internal.util.ArrayUtils.emptyArray(ArrayUtils.java:107)
at android.text.SpannableStringInternal.getSpans(SpannableStringInternal.java:269)
at android.text.SpannedString.getSpans(SpannedString.java:25)
at android.text.Styled.drawUniformRun(Styled.java:67)
at android.text.Styled.drawDirectionalRun(Styled.java:322)
at android.text.Styled.drawText(Styled.java:381)
at android.text.Layout.drawText(Layout.java:1703)
at android.text.Layout.draw(Layout.java:505)
at android.text.BoringLayout.draw(BoringLayout.java:365)
at android.widget.TextView.onDraw(TextView.java:4431)
at android.view.View.draw(View.java:6880)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.widget.ScrollView.draw(ScrollView.java:1703)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.buildDrawingCache(View.java:6640)
at android.view.View.getDrawingCache(View.java:6428)
at android.view.ViewGroup.drawChild(ViewGroup.java:1571)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1921)
at android.view.ViewRoot.draw(ViewRoot.java:1526)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1262)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1863)

我刚刚遇到了一个类似的错误,当
invalidateOptionsMenu()
连续两次被调用时(在onResume中,然后在onPrepareOptionsMenu中)


一旦我从OnPrepareOptions菜单中删除了
InvalidateOptions菜单()
调用,问题就消失了。也许在你的情况下不会发生这种情况,但我想我会提供一个可能的解决方案。

Android 2.x上的UI线程堆栈大小小于Android 4.x。这意味着旧版本更容易出现堆栈溢出错误。这就解释了为什么只有在旧版本上才会遇到这种情况

ABS的问题在于它会自动向布局(包含操作栏的主布局)添加一些嵌套视图。您可以使用层次查看器查看这些额外视图

如果您已经有一个包含许多嵌套视图的深度布局,那么添加ABS可能会添加填充堆栈的额外视图


我建议您简化布局并删除一些额外的视图。在Android开发者博客(Romain Guy)中有一些关于如何优化布局的提示。如果您保存了大约2-3个视图,它将补偿ABS添加的内容,您应该会很好。

谢谢。不幸的是,我最终没有使用ActionBarSherlock,只是在较新的Android版本上提供了标准的ActionBar。我会记住这一点的,当然要考虑一些事情。我在所有应用程序上使用ABS,并支持2.2版,没有任何问题。带ABS的应用看起来很不错:)