Android 修复StackOverflow错误
我开发了一个应用程序,其中有4个选项卡A、B、C、D。每个选项卡都包含一个活动。在第四个选项卡D中,我添加了一个ActivityGroup,其中我还有3个活动X、Y、Z。在第四个选项卡中,我添加了活动组,我遇到了StackOverflow错误。请帮助我修复此错误 这是我的stackTrace:--Android 修复StackOverflow错误,android,Android,我开发了一个应用程序,其中有4个选项卡A、B、C、D。每个选项卡都包含一个活动。在第四个选项卡D中,我添加了一个ActivityGroup,其中我还有3个活动X、Y、Z。在第四个选项卡中,我添加了活动组,我遇到了StackOverflow错误。请帮助我修复此错误 这是我的stackTrace:-- 请帮帮我…我对android很陌生。我想你在某处有一个无限循环 可能您已经在层次结构中的某个位置添加了两次相同的视图实例,现在您有了一个循环 解决这个问题。并修复您的布局。我看不出有什么理由有这么复杂
请帮帮我…我对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,然后再将返回的视图添加到其他位置)。我无法回答另一个问题。不可能添加两次视图,它会立即抛出一个异常,指出该视图已附加。所以这不可能是堆栈溢出的原因。