2010-05-04 10 views
23

Wenn Sie einen Fehler wie den folgenden erhalten (Android 1.5), liegt es daran, dass zu viele verschachtelte ViewGroups vorhanden sind oder weil die Gesamtzahl der Views zu groß ist? Gibt es irgendwelche Tricks, um es zu umgehen, während Sie immer noch das gleiche Aussehen zu Ihrer App haben?java.lang.StackOverFlow Fehler. Verdacht auf zu viele Ansichten?

java.lang.StackOverflowError 
    at android.text.Styled.measureText(Styled.java:371) 
    at android.text.Layout.measureText(Layout.java:1600) 
    at android.text.Layout.getLineMax(Layout.java:654) 
    at android.text.Layout.draw(Layout.java:310) 
    at android.text.BoringLayout.draw(BoringLayout.java:356) 
    at android.widget.TextView.onDraw(TextView.java:3921) 
    at android.view.View.draw(View.java:5838) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1486) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1484) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228) 
    at android.widget.AbsListView.dispatchDraw(AbsListView.java:1319) 
    at android.widget.ListView.dispatchDraw(ListView.java:2820) 
    at android.view.View.draw(View.java:5944) 
    at android.widget.AbsListView.draw(AbsListView.java:2121) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1486) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1484) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228) 
    at android.view.View.draw(View.java:5841) 
    at android.widget.FrameLayout.draw(FrameLayout.java:352) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1486) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1484) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228) 
    at android.view.View.draw(View.java:5841) 
    at android.widget.FrameLayout.draw(FrameLayout.java:352) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1486) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228) 
    at android.view.View.draw(View.java:5841) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1486) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228) 
    at android.view.View.draw(View.java:5841) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1486) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228) 
    at android.view.View.draw(View.java:5841) 
    at android.widget.FrameLayout.draw(FrameLayout.java:352) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1486) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1484) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1484) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1228) 
    at android.view.View.draw(View.java:5841) 
    at android.widget.FrameLayout.draw(FrameLayout.java:352) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1847) 
    at android.view.ViewRoot.draw(ViewRoot.java:1217) 
    at android.view.ViewRoot.performTraversals(ViewRoot.java:1030) 
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1482) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:3948) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540) 
    at dalvik.system.NativeStart.main(Native Method) 
+0

hey was die Lösung für dieses Problem? @Synic – Venkat

+0

Was ist die Lösung dieses Problems .... – NagarjunaReddy

Antwort

32

Sie haben (zu) viele verschachtelte Layouts. Sie können den offiziellen Android-Blog unter d.android.com besuchen, um Tipps und Tricks zum Optimieren von Layouts zu erhalten.

+1

Verflachen Sie Ihre Ansichtshierarchie, indem Sie Ihre Layouts durch relativ ersetzen. Artikelserie, die Romain hier vorgeschlagen hat: http://android-developers.blogspot.com/search/label/Optimization –

+44

Die Frage ist: Wie viel ist zu viel? Ist es dokumentiert? – neteinstein

+1

Update: Info über einen möglichen Referenzwert: http://stackoverflow.com/questions/9946368/stackoverflow-craced-by-nested-views – neteinstein

2

In meinem Fall

Customized Listenansicht Relative-Layout hat, dann freigegeben es Stackoverflowerror.

Wenn Ihre listview relativ Layout hat, dann löschen sie: D

+1

In meinem Fall hat es das für mich getan. Ein ListView in einem Fragment-View-Pager in einem Fragment-View-Pager mit einem RelativeLayout verursachte Abstürze auf APIs <14. Das Entfernen des RelativeLayout-Nachbearbeitens des Listview-Layouts machte den Trick (und die Leistung ist auch viel besser). – dell116

5

In meinem Fall ist es durch verschachtelte Layouts verursacht wurde (komplexe Liste itens) in einer Liste innerhalb einer Fragmentsicht Pager in einem anderen Fragmente, v4 mit Unterstützung und HoloEverywhere v1.4-Bibliotheken.

Ich musste verschachtelte Fragmente entfernen und auf andere Weise erstellen.

0

In meinem Fall war das ListView innerhalb einer ScrollView und wenn ich versuche, es nach unten zu scrollen. Es erzeugt Stackoverflow-Fehler.

Also, vermeiden Sie ListView innerhalb ScrollView.

Oder wir können einen anderen Ansatz verwenden, um ListView zu implementieren.

Android list view inside a scroll view

6

in meinem Fall gelöst ich in

onCreateView

 rootView = inflater.inflate(R.layout.fragment_interest_list, container); 
     return rootView; 

durch Zugabe von attachToRoot Parameter

  rootView = inflater.inflate(R.layout.fragment_interest_list,container,false); 
     return rootView; 
+0

In meinem Fall funktionierte das nicht, ich musste es in inflater.inflate ändern (R.layout.some_layout, null) – vanomart

+0

In meinem Fall hatte ich zuvor: rootView = inflater.inflate (R.layout.fragment_layout, container , wahr); Ich setze es auf: rootView = inflater.inflate (R.layout.fragment_layout, container, false) und voila! es funktionierte. –

0

In meinem Fall und in XamarinForms, löste ich diesen Fehler, indem ich CachingStrategy="RecycleElement" zu meinem ListView hinzufüge und auch zusätzliche Layouts entfernte.
Android-Benutzer sollten RecyclerView oder andere View-Recycling-Methoden verwenden.

0

Für Xamarin Formulare in unserem Fall mit ListViews hat das Problem nicht gelöst, die Ausnahme auf einem Karussell erhöht haben wir, und wir können nicht die Draw-Methode aus einem anderen Thread aufrufen, weil einige Grafiken mit NControl wir brauchen doesn erlauben wir das nicht (OpenGL bezogen, denke ich). Am Ende haben wir die Ausnahme in unserem benutzerdefinierten Karussell-Renderer abgefangen und das Problem mit Invalidate() behoben.