2012-10-23 6 views
4

J'ai intégré ActionBarSherlock dans mon application Android. Il fonctionne principalement bien, avec une exception sérieuse ...ActionBarSherlock pour Android causant StackOverflowError

Lorsque vous exécutez spécifiquement le niveau 10 de l'API (qui correspond à Android 2.3.3), et uniquement sur cette version, une erreur StackOverflowError (illustrée ci-dessous) se produit certain point lorsque l'utilisateur navigue entre deux activités particulières. La pile d'appel révèle que cette erreur se produit entièrement dans le cadre Android, indépendamment de mon code personnalisé. La seule raison pour laquelle je le sais est liée à ActionBarSherlock est que l'erreur ne se produit pas si je rétablis mes modifications aux classes d'activité afin qu'elles héritent à nouveau de la classe de base d'activité standard au lieu de SherlockActivity, et revenir à un thème non-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) 

Répondre

2

Je viens rencontré une erreur similaire lorsque invalidateOptionsMenu() était appelé deux fois de suite très rapide (en onResume, puis à onPrepareOptionsMenu).

Une fois que j'ai supprimé les appels invalidateOptionsMenu() de onPrepareOptionsMenu, le problème a disparu. Peut-être que ce n'est pas ce qui se passe dans votre situation, mais juste pensé que je l'offrirais comme une solution possible.

+0

Merci. J'ai malheureusement fini par ne pas utiliser ActionBarSherlock et simplement fournir le ActionBar standard uniquement sur les nouvelles versions d'Android. Je garderai cela à l'esprit cependant. – txdev

+1

Certainement quelque chose à considérer. J'utilise ABS sur toutes mes applications et le support à 2.2 sans aucun problème. Les applications ont l'air si belles avec ABS :) – DiscDev

2

La taille de la pile de threads de l'interface utilisateur sous Android 2.x est inférieure à celle d'Android 4.x. Cela signifie que les anciennes versions sont plus sujettes à StackOverflowErrors. Cela explique pourquoi vous ne rencontrez ce problème que sur une ancienne version.

Le problème avec ABS est qu'il ajoute automatiquement quelques vues imbriquées à votre mise en page (la mise en page principale qui contient la barre d'action). Vous pouvez voir ces vues supplémentaires en utilisant Hierarchy Viewer.

Si vous avez déjà une mise en page en profondeur avec de nombreuses vues imbriquées, l'ajout d'ABS a probablement ajouté les vues supplémentaires qui ont rempli votre pile.

Ce que je suggère est que vous simplifiez votre mise en page et supprimez certaines de vos vues supplémentaires. Il existe quelques astuces pour optimiser les mises en page dans le Blog développeur Android (par Romain Guy). Si vous économisez environ 2-3 vues, il devrait compenser ce que l'ABS a ajouté et vous devriez aller bien.

Questions connexes