Stackoverflow только для Android 2.3.3

Я работал над Native Android App где я столкнулся с некоторой ошибкой на чистых Android 2.3.3 versions and below Android 3.0 version .

Я не понимаю, где именно я попадаю в свой код, потому что в Logcat каждая строка кода скомпилирована, но в конце появляется очень странная ошибка, описывая журнал ниже:

 java.lang.StackOverflowError at java.util.concurrent.locks.ReentrantLock$NonfairSync.tryAcquire(ReentrantLock.java:189) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1171) at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185) at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:261) at java.util.concurrent.CopyOnWriteArrayList.removeRange(CopyOnWriteArrayList.java:569) at java.util.concurrent.CopyOnWriteArrayList.remove(CopyOnWriteArrayList.java:366) at java.util.concurrent.CopyOnWriteArrayList.remove(CopyOnWriteArrayList.java:376) at android.view.ViewTreeObserver.removeOnPreDrawListener(ViewTreeObserver.java:377) at android.widget.TextView.onDraw(TextView.java:4085) at android.view.View.draw(View.java:6986) at android.view.ViewGroup.drawChild(ViewGroup.java:1739) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466) at android.view.ViewGroup.drawChild(ViewGroup.java:1737) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466) at android.view.ViewGroup.drawChild(ViewGroup.java:1737) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466) at android.view.View.draw(View.java:6989) at android.view.ViewGroup.drawChild(ViewGroup.java:1739) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466) at android.view.View.draw(View.java:6989) at android.view.ViewGroup.drawChild(ViewGroup.java:1739) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466) at android.view.ViewGroup.drawChild(ViewGroup.java:1737) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466) at android.view.ViewGroup.drawChild(ViewGroup.java:1737) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466) at android.view.View.draw(View.java:6989) at android.view.ViewGroup.drawChild(ViewGroup.java:1739) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466) at android.view.View.draw(View.java:6989) at android.view.ViewGroup.drawChild(ViewGroup.java:1739) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466) at android.view.ViewGroup.drawChild(ViewGroup.java:1737) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466) at android.view.ViewGroup.drawChild(ViewGroup.java:1737) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466) at android.view.View.draw(View.java:6989) at android.widget.FrameLayout.draw(FrameLayout.java:361) at android.view.ViewGroup.drawChild(ViewGroup.java:1739) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466) at android.view.ViewGroup.drawChild(ViewGroup.java:1737) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466) at android.view.View.draw(View.java:6989) at android.view.ViewGroup.drawChild(ViewGroup.java:1739) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466) at android.view.View.draw(View.java:6989) at android.view.ViewGroup.drawChild(ViewGroup.java:1739) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466) at android.view.View.draw(View.java:7093) at android.widget.FrameLayout.draw(FrameLayout.java:361) at android.widget.ScrollView.draw(ScrollView.java:1421) at android.view.ViewGroup.drawChild(ViewGroup.java:1739) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466) at android.view.ViewGroup.drawChild(ViewGroup.java:1737) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466) at android.view.View.draw(View.java:6989) at android.widget.FrameLayout.draw(FrameLayout.java:361) at android.view.ViewGroup.drawChild(ViewGroup.java:1739) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1466) at android.view.ViewGroup.d 

Когда я проверил свой код, я не нашел трассировки для stackoverflow. Когда я запускаю тот же код в Android версии 3.0 или выше, он работает эффективно и корректно, но не на версии Android 2.3.3 и ниже 3.0. Пожалуйста, дайте мне знать, если кто-нибудь знает об этой проблеме?

[EDIT] Я использую вкладку Tab, так что основной макет – Main.xml, и в этом подзадаче хранится представление с именем firstTab_Results.xml , оно содержит макет таблицы, который действительно выполняет раздутие макс. 20 просмотров макета inflate_table_firstTab.xml .

[EDIT 2] Я все равно не рекурсирую его, он раздувает макс. 20 просмотров (inflate_table_firstTab.xml) в макет таблицы (firstTab_Results.xml).

 Note : Stackoverflow happens on single or dual core processor devices & without fullscreen mode . 

Solutions Collecting From Web of "Stackoverflow только для Android 2.3.3"

Ваша иерархия просмотров слишком глубока. Когда иерархия рисуется рекурсивно, вы исчерпываете пространство стека и не можете углубляться в иерархию, как это наблюдается в трассировке стека.

Почему это происходит только в более ранних устройствах, потому что размер стека потока пользовательского интерфейса составляет всего 12 КБ на устройствах Android 2.3, но 16 КБ в более поздних версиях ОС ( ссылка ).

Как уменьшить глубину иерархии представлений? Просто избегайте макетов раскроя, когда это возможно. Раскладки, которые вы размещаете, слишком сложны, и в вашей модели переполнения стека нет смысла фиксировать их (требуется некоторое время для правильной работы, и это, вероятно, слишком специфично, чтобы помочь другим), но вот некоторые общие рекомендации:

  • Удалите ненужные макеты. Например, в вашем файле firsttab_results.xml вам нужен только TableLayout , RelativeLayout и LinearLayout на вершине практически бесполезны. В вашем ScrollView есть как минимум 6 вложенных макетов, когда одного или не более двух, вероятно, будет достаточно.

  • Один ребенок в макете – это запах кода. В большинстве случаев это может быть достигнуто, перемещая ребенка на родительский макет и корректируя макет с полями.

  • Обычно нет необходимости размещать макеты внутри RelativeLayout . Относительная компоновка мощна при выделении своих детей с использованием относительного позиционирования и выравнивания базовой линии ребенка.

  • Если вам нужен вложенный макет только для background , попробуйте переместить фон, например, только View который имеет тот же размер, что и вложенный макет, и выкладывая другие элементы поверх него.

  • Обратите внимание на предупреждения Android Lint. Инструмент стал достаточно хорош в обнаружении сложностей иерархии представлений, которые можно было бы упростить.

У вас есть вложенная иерархия представлений, в которой вы можете увидеть свою иерархию представлений с помощью иерархииViewer в android. Если у вас много вложенных представлений в вашем приложении, то некоторые устройства имеют небольшую память, которые дают исключение, а для других он работает хорошо. Flatten ваши взгляды. Используйте RelativeLayout для выравнивания видов.

Используете ли вы рекурсию для создания своей иерархии представлений? Я почти никогда не вижу StackOverflowError без рекурсии.

Я не думаю, что вы видите свою ошибку из-за «гнездования» ваших взглядов. Я думаю, что это может быть проблема, связанная с тем, что раньше устройства не имели доступа к своей библиотеке, и ваш идеон не поймал ее, или вы не указали предупреждения и игнорируете их. Попробуйте взглянуть на ваши предупреждения о линге и посмотреть, не упоминает ли он что-либо о некоторых представлениях, или api не доступен в более ранних версиях.

Стек на Android ограничена 8K, даже, по крайней мере, у Samsung Galaxy S3, который имеет 2 ГБ оперативной памяти. Я не знаю, отличается ли он от устройства. Я не знаю, почему, спросил я, и они закрыли мой вопрос .

Ваш Main.xml очень вложен, любой используемый код, вероятно, вызывает переполнение стека. Количество стека, используемого для уровня вложенности, зависит от реализации, поэтому оно происходит на одной версии, а не на другой. Одна версия может вызывать цепочку из 5 функций, которая затем обрабатывает следующий уровень вложенного XML и т. Д., А одна – цепочкой 20.