Android 修复StackOverflow错误

Android 修复StackOverflow错误,android,Android,我开发了一个应用程序,其中有4个选项卡A、B、C、D。每个选项卡都包含一个活动。在第四个选项卡D中,我添加了一个ActivityGroup,其中我还有3个活动X、Y、Z。在第四个选项卡中,我添加了活动组,我遇到了StackOverflow错误。请帮助我修复此错误 这是我的stackTrace:-- 请帮帮我…我对android很陌生。我想你在某处有一个无限循环 可能您已经在层次结构中的某个位置添加了两次相同的视图实例,现在您有了一个循环 解决这个问题。并修复您的布局。我看不出有什么理由有这么复杂

我开发了一个应用程序,其中有4个选项卡A、B、C、D。每个选项卡都包含一个活动。在第四个选项卡D中,我添加了一个ActivityGroup,其中我还有3个活动X、Y、Z。在第四个选项卡中,我添加了活动组,我遇到了StackOverflow错误。请帮助我修复此错误

这是我的stackTrace:--


请帮帮我…我对android很陌生。

我想你在某处有一个无限循环

可能您已经在层次结构中的某个位置添加了两次相同的视图实例,现在您有了一个循环


解决这个问题。并修复您的布局。我看不出有什么理由有这么复杂的布局。

我想你在某处有一个无限循环

可能您已经在层次结构中的某个位置添加了两次相同的视图实例,现在您有了一个循环


解决这个问题。并修复您的布局。我看不出有什么理由拥有如此复杂的布局。

我在谷歌上搜索过,但找不到解决方案。然后,我刚刚提出了这个想法,它在我的旧三星Galaxy Nexus和沃达丰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();
        }
    }
}

因此,基本上我将复杂的绘图方法传递到具有更大堆栈大小的线程中。因此,调用的方法堆栈将停止增加该点的值。然后UI线程等待绘图线程完成其工作,然后继续确保它按顺序绘制,就像在UI线程上运行一样。

我在Google上搜索过,但找不到解决方案。然后,我刚刚提出了这个想法,它在我的旧三星Galaxy Nexus和沃达丰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();
        }
    }
}

因此,基本上我将复杂的绘图方法传递到具有更大堆栈大小的线程中。因此,调用的方法堆栈将停止增加该点的值。然后UI线程等待绘图线程完成其工作,然后继续确保它按顺序绘制,就像在UI线程上运行一样。

发布代码。如果没有看到导致错误的代码,这个stacktrace就是不可读的。很难知道出了什么问题,但似乎最终会在某个地方出现消耗内存的递归。发布代码而不是stacktraceposting代码有点困难,因为它有许多活动。在我的应用程序中,我有4个选项卡,其中包含活动名称a、B、C、D。在第4个选项卡中,当它包含3个子活动D1、D2、D3时,会引发此异常。在选项卡D中,我可以这样导航。。。。D->D1,D->D2,D2->D3,然后从D3返回到D。经过一定数量的操作后,它会抛出stackOverflow异常。我无法解释出现错误的原因。请使用“相对”替换布局以展平视图层次结构。Romain在这里推荐的一系列文章:android-developers.blogspot.com/search/label/OptimizationPost-your-code。如果没有看到导致错误的代码,这个stacktrace就是不可读的。很难知道出了什么问题,但似乎最终会在某个地方出现消耗内存的递归。发布代码而不是stacktraceposting代码有点困难,因为它有许多活动。在我的应用程序中,我有4个选项卡,其中包含活动名称a、B、C、D。在第4个选项卡中,当它包含3个子活动D1、D2、D3时,会引发此异常。在选项卡D中,我可以这样导航。。。。D->D1,D->D2,D2->D3,然后从D3返回到D。经过一定数量的操作后,它会抛出stackOverflow异常。我无法解释出现错误的原因。请使用“相对”替换布局以展平视图层次结构。Romain在这里推荐的一系列文章:android-developers.blogspot.com/search/label/OptimizationHi Pedro loureiro!!我想你很正确地理解了我的错误。你能告诉我如何跟踪我使用同一个视图实例的位置吗?还有一件事我想问的是,为了用新视图替换选项卡的contentView,我们应该使用哪个标志常量???+除非你在那一刻创建了视图,否则不要通过代码添加视图。。。不要再加两次!(永远不要先查找dviewbyd,然后再将返回的视图添加到其他位置)。我无法回答另一个问题。不可能添加两次视图,它会立即抛出一个异常,指出该视图已附加。所以这不可能是堆栈溢出的原因。嗨,佩德罗·卢雷罗!!我想你很正确地理解了我的错误。你能告诉我如何跟踪我使用同一个视图实例的位置吗?还有一件事我想问的是,为了用新视图替换选项卡的contentView,我们应该使用哪个标志常量???+除非你在那一刻创建了视图,否则不要通过代码添加视图。。。不要再加两次!(永远不要先查找dviewbyd,然后再将返回的视图添加到其他位置)。我无法回答另一个问题。不可能添加两次视图,它会立即抛出一个异常,指出该视图已附加。所以这不可能是堆栈溢出的原因。