Android中递归调用导致栈溢出错误如何解决?
How to solve recursive call that causes stack overflow error in Android?
我的 Android 应用程序中有一个计划的间隔任务。假设这是一个对USB连接设备的健康检查任务,每10分钟运行一次。根据下面的class代码,任务是通过调用start()
方法启动的。
//...
/**
* Handler callback
*/
private Runnable handlerCallback = new Runnable() {
@Override
public void run() {
sendRequest();
handler.postDelayed(handlerCallback, interval);
}
};
/**
* Start the repeated task
*/
public void start() {
handlerCallback.run();
}
/**
* Stop the task
*/
public void stop() {
handler.removeCallbacks(handlerCallback);
}
/**
* Send request
*/
public void sendRequest() {
CmdRequestHealthCheck cmd = new CmdRequestHealthCheck();
mAccessor.Write(cmd.get(), mWrite);
}
/**
* Request Health Check
*/
protected final WriteCallback mWrite = new WriteCallback() {
@Override
public void onWrite(boolean bStatus, Exception oError) {
if (bStatus) {
// Success
repeatCounter = Globals.HEALTH_CHECK_REPEAT;
Toast.makeText(context, "Success", Toast.LENGTH_LONG).show();
} else {
// Fail
if (repeatCounter == 0) {
// finally show error
Toast.makeText(context, "Failed", Toast.LENGTH_LONG).show();
// if there is error message returned
if (oError != null) {
Toast.makeText(context, oError.toString(), Toast.LENGTH_LONG).show();
}
} else {
// Immediate Retry for xx times
sendRequest();
repeatCounter--;
}
}
}
};
当第一个请求失败时,将立即发送第二个请求,而无需等待下一个间隔 10 分钟。紧接的下一个支票将根据repeatCounter
发送,例如2次或3次。但是,当在 onWrite()
中调用第二个 sendRequest()
时,会抛出 threadid=1: stack overflow on call
。我想这是一个递归问题。
mWrite
是对 mAccessor.Write()
;
的回调
我该如何解决这个问题?
我发现了 2 个可能的问题:
递减 repeatCounter
在 再次调用 sendRequest
之前。
停止情况应该是 - “if (repeatCounter <= 0)
”而不是“==
”,以避免可能出现的问题,即在检查 repeatCounter
我的 Android 应用程序中有一个计划的间隔任务。假设这是一个对USB连接设备的健康检查任务,每10分钟运行一次。根据下面的class代码,任务是通过调用start()
方法启动的。
//...
/**
* Handler callback
*/
private Runnable handlerCallback = new Runnable() {
@Override
public void run() {
sendRequest();
handler.postDelayed(handlerCallback, interval);
}
};
/**
* Start the repeated task
*/
public void start() {
handlerCallback.run();
}
/**
* Stop the task
*/
public void stop() {
handler.removeCallbacks(handlerCallback);
}
/**
* Send request
*/
public void sendRequest() {
CmdRequestHealthCheck cmd = new CmdRequestHealthCheck();
mAccessor.Write(cmd.get(), mWrite);
}
/**
* Request Health Check
*/
protected final WriteCallback mWrite = new WriteCallback() {
@Override
public void onWrite(boolean bStatus, Exception oError) {
if (bStatus) {
// Success
repeatCounter = Globals.HEALTH_CHECK_REPEAT;
Toast.makeText(context, "Success", Toast.LENGTH_LONG).show();
} else {
// Fail
if (repeatCounter == 0) {
// finally show error
Toast.makeText(context, "Failed", Toast.LENGTH_LONG).show();
// if there is error message returned
if (oError != null) {
Toast.makeText(context, oError.toString(), Toast.LENGTH_LONG).show();
}
} else {
// Immediate Retry for xx times
sendRequest();
repeatCounter--;
}
}
}
};
当第一个请求失败时,将立即发送第二个请求,而无需等待下一个间隔 10 分钟。紧接的下一个支票将根据repeatCounter
发送,例如2次或3次。但是,当在 onWrite()
中调用第二个 sendRequest()
时,会抛出 threadid=1: stack overflow on call
。我想这是一个递归问题。
mWrite
是对 mAccessor.Write()
;
我该如何解决这个问题?
我发现了 2 个可能的问题:
递减
repeatCounter
在 再次调用sendRequest
之前。停止情况应该是 - “
if (repeatCounter <= 0)
”而不是“==
”,以避免可能出现的问题,即在检查repeatCounter