ActionBarSherlock for Android causing a StackOverflowError

I have included ActionBarSherlock in my Android app. This basically works well, with one major exception ...

When launched at API level 10 (which corresponds to Android 2.3.3), and only in this version, a StackOverflowError (shown below) occurs at a certain moment when the user moves between two specific actions. The call stack shows that this error occurs entirely within Android, regardless of my custom code.

The only reason I know this is related to ActionBarSherlock is because the error does not occur if I revert my changes to the activity classes so that they again inherit from the standard Activity base class instead of SherlockActivity and return to non- -Sherlock theme.

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) 
+4
source share
2 answers

I ran into a similar error when invalidateOptionsMenu() was called twice in a very fast sequence (in onResume and then in onPrepareOptionsMenu).

As soon as I removed the invalidateOptionsMenu() calls from onPrepareOptionsMenu, the problem disappeared. Perhaps this is not what is happening in your situation, but just thought that I was proposing this as a possible solution.

+2
source

The user interface thread stack size on Android 2.x is smaller than Android 4.x. This means that older versions are more prone to StackOverflowErrors. This explains why you only experience this in the older version.

The problem with ABS is that it automatically adds a few nested views to your layout (the main layout that contains the action bar). You can see these additional views using View Hierarchy .

If you already have a deep layout with many nested views, adding ABS probably added extra views that populated your stack.

I suggest you simplify the layout and remove some of your additional views. There are some tips on how to optimize layouts on the Android Developers Blog (by Romain Guy). If you save about 2-3 views, it should compensate for the fact that ABS is added, and you should be fine.

+2
source

Source: https://habr.com/ru/post/1441461/


All Articles