3

このエグゼキュータに既知の問題はありますか? または、間違った方法で使用していますか?別のスレッドでアップロードをスケジュールする必要があり、現在のアップロードが完了してから一定時間後に次のアップロードを開始したい。

したがって、私の 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倍の遅延!それはどのように可能ですか?

4

1 に答える 1

1

AlarmManagerExecutor/handler の代わりに使用するか、部分的なウェイクロックを使用して CPU をオンにしておく必要があります。

CPU がスリープ モードの場合、電話が復帰するまでアプリは実行されません。私の知る限り、デバイスを起動することによって
のみコールバックを取得できます。これには、どちらかAlarmManagerを使用するか 、タイプする必要があります。他のオプションを使用すると、やはり遅延が発生します。ELAPSED_REALTIME_WAKEUPRTC_WAKEUP

于 2013-01-11T07:59:40.390 に答える