Ошибка java.lang.StackOverFlow. Подозреваете слишком много просмотров?

Когда вы получаете сообщение об ошибке, подобное приведенному ниже (Android 1.5), это связано с тем, что слишком много вложенных ViewGroups или потому, что общее количество Views слишком велико? Есть ли какие-то хитрости, чтобы обойти это, сохраняя при этом тот же внешний вид вашего приложения?

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)

person synic    schedule 04.05.2010    source источник
comment
Привет, какое решение этой проблемы?? @синик   -  person Venkat    schedule 07.06.2013
comment
какое решение этой проблемы....   -  person NagarjunaReddy    schedule 20.08.2013


Ответы (7)


У вас слишком много вложенных макетов. Вы можете проверить официальный блог Android на d.android.com, чтобы получить советы и рекомендации по оптимизации макетов.

person Romain Guy    schedule 04.05.2010
comment
сгладьте иерархию представлений, заменив макеты относительными. Серия статей, предложенных Роменом здесь: android-developers.blogspot.com/search/label/ Оптимизация - person Alex Volovoy; 04.05.2010
comment
Вопрос в том, насколько много? Это задокументировано? - person neteinstein; 30.03.2012
comment
Обновление: информация о возможном ссылочном значении: stackoverflow.com/ вопросы/9946368/ - person neteinstein; 23.01.2014
comment
Действительно, это была проблема, с которой я сталкивался до сих пор. Просто пришлось переставить некоторые вложенные представления. Спасибо! - person Marcelo Noguti; 03.12.2014

в моем случае я решил в

onCreateView

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

добавив параметр attachToRoot

         rootView = inflater.inflate(R.layout.fragment_interest_list,container,false);
         return rootView;
person Ishtiaq    schedule 07.09.2015
comment
В моем случае это не сработало, мне пришлось изменить его на inflater.inflate(R.layout.some_layout, null) - person vanomart; 10.12.2015
comment
В моем случае у меня раньше было: rootView = inflater.inflate(R.layout.fragment_layout, container, true); Я установил значение: rootView = inflater.inflate(R.layout.fragment_layout, container, false) и вуаля! это сработало. - person Abhinav Puri; 12.03.2016

В моем случае это было вызвано вложенными макетами (сложные списки) в списке внутри пейджера просмотра фрагментов внутри другого фрагмента с использованием поддержки v4 и библиотек HoloEverywhere v1.4.

Пришлось удалить вложенные фрагменты и построить по-другому.

person JPMagalhaes    schedule 05.12.2012

В моем случае,

Настраиваемое представление списка имеет относительный макет, затем выпущено Stackoverflowerror.

Если ваш listview имеет относительный макет, сотрите его :D

person larsien    schedule 11.07.2011
comment
В моем случае это сделало это для меня. Наличие ListView внутри пейджера фрагментного представления, внутри пейджера фрагментного представления с RelativeLayout вызывало сбои в API ‹ 14. Удаление RelativeLayout, перерабатывающее макет списка, помогло (и производительность также намного лучше). - person dell116; 13.01.2015

В моем случае это было ListView внутри ScrollView, и когда я пытаюсь прокрутить его вниз. Выдает ошибку stackoverflow.

Поэтому избегайте ListView внутри ScrollView.

Или мы можем использовать другой подход для реализации ListView.

Представление списка Android внутри представления прокрутки

person Vinit Siriah    schedule 01.01.2014

В моем случае и в XamarinForms я решил эту ошибку, добавив CachingStrategy="RecycleElement" к ListView, а также удалив лишние макеты.
Пользователи Android должны использовать RecyclerView или другие методы повторного использования представлений.

person Dr TJ    schedule 09.08.2016

Для Xamarin Forms в нашем случае использование ListViews не решило проблему, исключение продолжало возникать на карусели, которая у нас есть, и мы не можем вызвать метод рисования из другого потока, потому что некоторая графика, нарисованная с помощью NControl, которая нам нужна, не позволяет нам сделать это (я думаю, связанный с OpenGL). Так что, в конце концов, просто поймав исключение в нашем пользовательском рендерере карусели и вызвав для него Invalidate(), проблема была решена.

person Pablo López Martínez    schedule 03.11.2016