Android - ошибка переполнения стека - PullRequest
4 голосов
/ 16 марта 2012

Есть проблема с StackOverflowError. Хуже всего то, что сейчас это происходит только на одном устройстве. Я тестировал до сих пор:

Samsung Galaxy SII (2.3.4)

Samsung Nexus S (4.0.3)

HTC Wildfire (2.3.7 и 2.2)

Samsung Galaxy Tab 10.1 (3.2)

... и все в порядке. Но когда я отправляю приложение клиенту, и он тестировал его в HTC Holiday 2.3.4, его сбой при этом Ошибка:

java.lang.StackOverflowError
at android.widget.TextView.onDraw(TextView.java:4329)
at android.view.View.draw(View.java:6993)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.ViewGroup.drawChild(ViewGroup.java:1730)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:7105)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.widget.ScrollView.draw(ScrollView.java:1417)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.ViewGroup.drawChild(ViewGroup.java:1730)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.ViewGroup.drawChild(ViewGroup.java:1730)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.ViewGroup.drawChild(ViewGroup.java:1730)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.ViewGroup.drawChild(ViewGroup.java:1730)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.ViewGroup.drawChild(ViewGroup.java:1730)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.ViewGroup.drawChild(ViewGroup.java:1730)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.ViewGroup.drawChild(ViewGroup.java:1730)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.view.ViewGroup.drawChild(ViewGroup.java:1732)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459)
at android.view.View.draw(View.java:6996)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2054)
at android.view.ViewRoot.draw(ViewRoot.java:1632)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1335)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1991)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:4358)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
at dalvik.system.NativeStart.main(Native Method)

Есть какая-то возможность, которую я не знаю, увеличить память и т. Д. Приложение сложное, и все находится на TabWidget в качестве основной деятельности. Ошибка возникает в одном действии, где я использую listView, который я использую scrollview с динамически добавленным видом.

Подробнее:

1) Место, где у меня ошибка, - это TabWidget, который есть внутри другого TabWidget с двумя намерениями.

Что лучше? Есть TabWidget с TabWidget внутри или только один TabWidget и намерение с поддельными кнопками вкладок, чтобы с содержимым setContentView (...).

2) При первом намерении у меня есть два ScrollView, в первом я динамически добавляю виды с изображением пользователя и теми же данными. Когда вы нажимаете на пользователя, появляется анимация со вторым ScrollView, которая также динамически заполняется более детальными пользовательскими данными. Все представления происходят из XML-файлов.

Эта ошибка не возникала при использовании ListView без анимации, и для отображения подробного представления я просто изменяю представление содержимого с помощью метода setContentView. Должен ли я вернуться к этому методу? Спасибо за любую помощь.

3) Почему эта ошибка возникает только на одном устройстве? К сожалению, это клиентское устройство находится в США, я в Великобритании, поэтому у меня нет возможности воспроизвести ошибку.

Ответы [ 3 ]

3 голосов
/ 16 марта 2012

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

Для получения более подробной помощи, пожалуйста, оставьте журнал ошибок и другую информацию.

0 голосов
/ 06 апреля 2018

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

0 голосов
/ 17 октября 2014

Избегайте вызова любой службы или метода внутри пейджера на выбранной странице, потому что этот метод вызывается рекурсивно много раз и в конечном итоге приводит к ошибке stackoverflow.

...