このエグゼキュータに既知の問題はありますか? または、間違った方法で使用していますか?別のスレッドでアップロードをスケジュールする必要があり、現在のアップロードが完了してから一定時間後に次のアップロードを開始したい。
したがって、私の Service 実装からのコードの抜粋があります。
ScheduledExecutorService periodicUploadExecutor;
@Override
public void onCreate() {
super.onCreate();
// some stuff...
periodicUploadExecutor = Executors.newSingleThreadScheduledExecutor();
periodicUploadExecutor.schedule(uploadPointsToServer, getCurrentUploadIntervalInMs(), TimeUnit.MILLISECONDS);
}
private Runnable uploadPointsToServer = new Runnable() {
public void run() {
Log.d("SOMETAG", "--->>> UPLOAD runnable started!");
// upload stuff here...
Log.d("SOMETAG", " upload runnable scheduling next after "+getCurrentUploadIntervalInMs());
periodicUploadExecutor.schedule(uploadPointsToServer, getCurrentUploadIntervalInMs(), TimeUnit.MILLISECONDS);
Log.d("SOMETAG", "<<<--- upload runnable ENDED!");
}
}
private final int getCurrentActiveSampIntervalInMs() {
return 300000; // just an example
}
しかし、ログを調べると、次のことがわかります。
01-08 15:33:42.166 D/SOMETAG ( 4606): --->>> UPLOAD runnable started!
01-08 15:33:43.166 D/SOMETAG ( 4606): upload runnable scheduling next after 300000
01-08 15:33:43.166 D/SOMETAG ( 4606): <<<--- upload runnable ENDED!
01-08 15:38:43.166 D/SOMETAG ( 4606): --->>> UPLOAD runnable started!
01-08 15:38:44.174 D/SOMETAG ( 4606): upload runnable scheduling next after 300000
01-08 15:38:44.174 D/SOMETAG ( 4606): <<<--- upload runnable ENDED!
01-08 15:43:44.174 D/SOMETAG ( 4606): --->>> UPLOAD runnable started!
01-08 15:43:45.143 D/SOMETAG ( 4606): upload runnable scheduling next after 300000
01-08 15:43:45.143 D/SOMETAG ( 4606): <<<--- upload runnable ENDED!
01-08 16:01:38.887 D/SOMETAG ( 4606): --->>> UPLOAD runnable started!
最初の 3 つはうまくいきますが、最後の 1 つは 5 分ではなく 18 分後に始まります。このサービスは 15:43 から 16:01 の間に位置の更新も取得しますが、位置リスナーはメイン スレッドで動作し、位置の更新の間に数秒の長い期間があるため、スケジュールされたエグゼキューターの起動をブロックするものは何もありません...予定の3倍の遅延!それはどのように可能ですか?