stack=java.lang.StackOverflowError: stack size 8MB
stack=java.lang.StackOverflowError: stack size 8MB
我收到这个 Whosebug 错误,我完全理解它,但问题是我没有处理大数据,那么这个错误是如何产生的?
我有一个activity,框架布局,一个片段,3个选项。
在片段中,当你点击其中一个选项时,它会重新创建片段并放入随机数,最大值是15
,所以它不是那么大,这个错误发生在用户快速点击导致溢出的选项。
这是生成代码,关于 "enhancing" 有什么想法吗?我不知道这段代码是否不利于记忆使用。
private static List<Integer> SavedNumbers;
public static void SetupSavedNumbersLIst(){
SavedNumbers = new ArrayList<>();
}
static List<Integer> range;
private static void AddDiff(int mMAX){
range = new ArrayList<>();
for(int i = 0 ; i < mMAX ; i++){
range.add(i);
}
range.removeAll(SavedNumbers);
}
private static int ReturnIfDuplic(int mMAX){
AddDiff(mMAX);
return new Random().nextInt(range.size());
}
public static int ReturnUniqueSavedNumber(int mMAX){
int Random = ReturnRandom(mMAX);
if(SavedNumbers != null && SavedNumbers.size() > 0) {
if(DoesSavedNumberExist(Random)){
return ReturnIfDuplic(mMAX);
} else {
SavedNumbers.add(Random);
return Random;
}
} else if (SavedNumbers != null && SavedNumbers.size() == 0){
SavedNumbers.add(Random);
return Random;
} else if( SavedNumbers == null){
SetupSavedNumbersLIst();
return ReturnUniqueSavedNumber(mMAX);
} else {
return 1;
}
}
private static boolean DoesSavedNumberExist(int Number){
for(int s: SavedNumbers){
if(Number == s)
return true;
}
return false;
}
private static int ReturnRandom(int mMAX){
return new Random().nextInt(mMAX);
}
如果您碰巧随机抽取了您已经保存的相同数字,则此行将递归:
if(DoesSavedNumberExist(Random)){
return ReturnUniqueSavedNumber(mMAX);
}
如果你已经保存了 1-15,而你的最大值是 15,这将保证堆栈溢出,因为它永远不会满足 if 语句。这通常也是 "random number no good, just try again" 的一种糟糕方法,因为随着您添加越来越多的数字,您将添加越来越多的递归。更好的方法可能是使用随机数作为索引,进入可能的数字,以便选择。
我遇到了同样的问题 Stack Size 8MB。当我点击我的添加项时 api 得到了同样的错误。我认为这是在从编辑文本中获取值时发生的。所以我改变了我的方式并在服务调用
之前获取我的inIT();
中的值
inIT()
sys = input_Systolic.getText().toString();
dys = input_Diastolic.getText().toString();
_date = dateView.getText().toString();
tim = time.getText().toString();
改造调用
HashMap<String, Object> pMap = new HashMap<>();
pMap.put("user_id",loginStatusModal.getUser_id());
pMap.put("relative_id",rel_id);
pMap.put("systolic",sys);
pMap.put("diastolic",dys);
pMap.put("report_date",_date);
pMap.put("report_time",tim);
使用这个我解决了我的堆栈大小 8mb 错误。
我在尝试使用 intent.putExtra()
传递许多值时遇到了同样的问题。
我通过将所有数据保存在共享首选项中解决了这个问题。然后,您可以在后面的部分访问应用程序中所需的任何片段或活动。
Refer this question to learn more about saving data using shared preferences.
我收到这个 Whosebug 错误,我完全理解它,但问题是我没有处理大数据,那么这个错误是如何产生的?
我有一个activity,框架布局,一个片段,3个选项。
在片段中,当你点击其中一个选项时,它会重新创建片段并放入随机数,最大值是15
,所以它不是那么大,这个错误发生在用户快速点击导致溢出的选项。
这是生成代码,关于 "enhancing" 有什么想法吗?我不知道这段代码是否不利于记忆使用。
private static List<Integer> SavedNumbers;
public static void SetupSavedNumbersLIst(){
SavedNumbers = new ArrayList<>();
}
static List<Integer> range;
private static void AddDiff(int mMAX){
range = new ArrayList<>();
for(int i = 0 ; i < mMAX ; i++){
range.add(i);
}
range.removeAll(SavedNumbers);
}
private static int ReturnIfDuplic(int mMAX){
AddDiff(mMAX);
return new Random().nextInt(range.size());
}
public static int ReturnUniqueSavedNumber(int mMAX){
int Random = ReturnRandom(mMAX);
if(SavedNumbers != null && SavedNumbers.size() > 0) {
if(DoesSavedNumberExist(Random)){
return ReturnIfDuplic(mMAX);
} else {
SavedNumbers.add(Random);
return Random;
}
} else if (SavedNumbers != null && SavedNumbers.size() == 0){
SavedNumbers.add(Random);
return Random;
} else if( SavedNumbers == null){
SetupSavedNumbersLIst();
return ReturnUniqueSavedNumber(mMAX);
} else {
return 1;
}
}
private static boolean DoesSavedNumberExist(int Number){
for(int s: SavedNumbers){
if(Number == s)
return true;
}
return false;
}
private static int ReturnRandom(int mMAX){
return new Random().nextInt(mMAX);
}
如果您碰巧随机抽取了您已经保存的相同数字,则此行将递归:
if(DoesSavedNumberExist(Random)){
return ReturnUniqueSavedNumber(mMAX);
}
如果你已经保存了 1-15,而你的最大值是 15,这将保证堆栈溢出,因为它永远不会满足 if 语句。这通常也是 "random number no good, just try again" 的一种糟糕方法,因为随着您添加越来越多的数字,您将添加越来越多的递归。更好的方法可能是使用随机数作为索引,进入可能的数字,以便选择。
我遇到了同样的问题 Stack Size 8MB。当我点击我的添加项时 api 得到了同样的错误。我认为这是在从编辑文本中获取值时发生的。所以我改变了我的方式并在服务调用
之前获取我的inIT();
中的值
inIT()
sys = input_Systolic.getText().toString();
dys = input_Diastolic.getText().toString();
_date = dateView.getText().toString();
tim = time.getText().toString();
改造调用
HashMap<String, Object> pMap = new HashMap<>();
pMap.put("user_id",loginStatusModal.getUser_id());
pMap.put("relative_id",rel_id);
pMap.put("systolic",sys);
pMap.put("diastolic",dys);
pMap.put("report_date",_date);
pMap.put("report_time",tim);
使用这个我解决了我的堆栈大小 8mb 错误。
我在尝试使用 intent.putExtra()
传递许多值时遇到了同样的问题。
我通过将所有数据保存在共享首选项中解决了这个问题。然后,您可以在后面的部分访问应用程序中所需的任何片段或活动。
Refer this question to learn more about saving data using shared preferences.