исправление ошибки StackOverflow

1

Я разработал приложение, в котором у меня есть 4 вкладки A, B, C, D. Каждая вкладка содержит Activity. На четвертой вкладке DI добавили ActivityGroup, в которой у меня есть еще 3 действия X, Y, Z. В четвертой вкладке, где я добавил группу действий, я получаю ошибку StackOverflow. Пожалуйста, помогите мне в исправлении этой ошибки.

это мой stackTrace: -

07-15 15:22:45.587: ERROR/AndroidRuntime(222): Uncaught handler: thread main exiting due to uncaught exception
07-15 15:22:45.677: ERROR/AndroidRuntime(222): java.lang.StackOverflowError
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.widget.AbsListView.dispatchDraw(AbsListView.java:1324)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.widget.ListView.dispatchDraw(ListView.java:2972)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.View.draw(View.java:6641)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.widget.AbsListView.draw(AbsListView.java:2171)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1531)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.View.draw(View.java:6538)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1531)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.View.draw(View.java:6538)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1531)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.View.draw(View.java:6538)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1531)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.View.draw(View.java:6538)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1531)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.View.draw(View.java:6538)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1531)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.View.draw(View.java:6538)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1531)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.View.draw(View.java:6538)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1531)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.view.View.draw(View.java:6538)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at android.widget.FrameLayout.draw(FrameLayout.java:352)
07-15 15:22:45.677: ERROR/AndroidRuntime(222):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow

Пожалуйста, помогите мне... Я очень новичок в андроиде.

  • 0
    Разместите свой код. Эта трассировка стека просто не читается
  • 1
    Не видя код, который вызывает ошибку, действительно трудно понять, что происходит не так, но кажется, что вы в конечном итоге где-то используете рекурсию, потребляющую память.
Показать ещё 7 комментариев
Теги:

3 ответа

4

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

    private Handler mHandler = new Handler();

    @Override
    public void draw(Canvas canvas) {
            try {
                    super.draw(canvas);
            } catch (StackOverflowError e) {
                    mHandler.postDelayed(new Runnable() {
                            public void run() {
                                    invalidate();
                            }
                    }, 1);
            }
    }

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

Я по-прежнему согласен с другими людьми в том, что лучшим решением является создание лучшего макета. Это обходное решение должно использоваться ТОЛЬКО, если нет другого способа сделать ваш макет.

РЕДАКТИРОВАТЬ: это обходное решение, похоже, действительно не работает. Кажется, что единственный способ решить проблему - уменьшить иерархию глубины представления.

1

Я предполагаю, что у вас есть бесконечный цикл где-то.

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

Исправьте это. И исправьте макет. Я не вижу причины иметь такой сложный макет.

  • 0
    Привет, Педро Лоурейро! Я думаю, что вы очень сильно поняли мою ошибку. Можете ли вы сказать мне, как отследить это, где я использую тот же экземпляр представления. И еще 1 вещь, которую я хотел спросить, какие константы FLAG мы должны использовать с намерением заменить contentView вкладки на новое представление ?? ? +
  • 0
    никогда не добавляйте представление по коду, если вы не создали его в этот момент ... и не добавляйте его дважды! (Никогда не выполняйте findViewById, а затем добавляйте возвращенное представление в другое место). Я не могу ответить на другой вопрос.
Показать ещё 1 комментарий
0

У меня есть поиск по всему Google, но не нашел решения. Тогда я только что придумал эту идею, и она отлично работает на моем старом Samsung Galaxy Nexus и Vodafone VF695!

Вот мой взлом в корневой FrameLayout моей очень глубокой компоновки:

public class StackFrameLayout extends FrameLayout {
    private boolean stackOverflow;

    @Override
    public void draw(final Canvas canvas) {
        if (stackOverflow) {
            stackDraw(canvas);
        } else {
            try {
                super.draw(canvas);
            } catch (StackOverflowError e) {
                stackOverflow = true;
                stackDraw(canvas);
            }
        }
    }

    public void stackDraw(final Canvas canvas) {
        Thread thread = new Thread(getContext().getMainLooper().getThread().getThreadGroup(), new Runnable() {
            @Override
            public void run() {
                StackFrameLayout.super.draw(canvas);
            }
        }, "draw-thread", 2000000);
        thread.start();
        try {
            thread.join();
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
    }
}

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню