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 个可能的问题:

  1. 递减 repeatCounter 再次调用 sendRequest 之前。

  2. 停止情况应该是 - “if (repeatCounter <= 0)”而不是“==”,以避免可能出现的问题,即在检查 repeatCounter