2016-05-18 4 views
0

私は私の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()へのコールバックです。

どうすればこの問題を解決できますか?

答えて

0

私は2潜在的な問題を発見しました:

  1. は再びsendRequestを呼び出す前repeatCounterをデクリメント。

  2. 停止する場合はする必要があります - 「if (repeatCounter <= 0)」ではない「==」あなたはrepeatCounter

で値をチェックポイントに入る前に二回デクリメント可能性の問題を回避するために、
関連する問題