私は私のAndroidアプリケーションでのスケジュールされた間隔のタスクを持っています。 USB接続デバイスに対するヘルスチェックのタスクであり、10分ごとに実行されているとします。以下のクラスコードに従って、start()
メソッドを呼び出すことによってタスクが開始されます。どのようにAndroidの中でスタックオーバーフローエラーが発生する再帰呼び出しを解決するには?
//...
/**
* 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--;
}
}
}
};
最初のリクエストが失敗した場合、直ちに2番目のリクエストが次の間隔を10分間待たずに送信されます。即時次のチェックは、例えば、repeatCounter
に従って2回又は3回送信されます。二sendRequest()
がonWrite()
に呼び出されたときしかし、threadid=1: stack overflow on call
がスローされます。私は再帰的な問題だと思う。
mWrite
はmAccessor.Write()
へのコールバックです。
どうすればこの問題を解決できますか?