web-dev-qa-db-ja.com

Androidタイマースケジュールvs scheduleAtFixedRate

私はAndroid 10分ごとに音声を記録するアプリケーションを作成しています。それを行うためにTimerを使用しています。しかし、scheduleとscheduleAtFixedRateの違いは何ですか?他の上に?

40
DXM

違いは Android以外のこのドキュメント で最もよく説明されています:

固定レートタイマー(scheduleAtFixedRate())は開始時間に基づいています(したがって、各反復は_startTime + iterationNumber * delayTime_で実行されます)。

固定レートの実行では、各実行は、最初の実行のスケジュールされた実行時間に関連してスケジュールされます。何らかの理由(ガベージコレクションや他のバックグラウンドアクティビティなど)で実行が遅れると、2つ以上の実行が連続して発生し、「追いつき」ます。

固定遅延タイマー(schedule())は前の実行に基づいています(したがって、各反復は_lastExecutionTime + delayTime_で実行されます)。

固定遅延実行では、各実行は前の実行の実際の実行時間を基準にしてスケジュールされます。何らかの理由(ガベージコレクションやその他のバックグラウンドアクティビティなど)で実行が遅れると、後続の実行も遅れます。

これとは別に、違いはありません。重要なパフォーマンスの違いも見つかりません。

他の何かとの同期を維持したい場合にこれを使用する場合は、scheduleAtFixedRate()を使用します。 schedule()からの遅延はドリフトし、エラーを引き起こす可能性があります。

89
Eric

単純なschedule()メソッドは、scheduleAtFixedRate()メソッドが特定の時間間隔で何度も繰り返しタスクを繰り返すための追加のパラメーターを取りながら、一度に実行されます。

構文を見て:

Timer timer = new Timer(); 
timer.schedule( new performClass(), 30000 );

これは、30秒の時間間隔が終了した後に1回実行されます。一種のタイムプットアクション。

Timer timer = new Timer(); 
//timer.schedule(task, delay, period)
//timer.schedule( new performClass(), 1000, 30000 );
// or you can write in another way
//timer.scheduleAtFixedRate(task, delay, period);
timer.scheduleAtFixedRate( new performClass(), 1000, 30000 );

これは1秒後に開始され、30秒ごとに繰り返されます。

15
Lucifer

Java.util.Timer.TimerImpl.TimerHeapコードによる

// this is a repeating task,
if (task.fixedRate) {
    // task is scheduled at fixed rate
    task.when = task.when + task.period;
} else {
    // task is scheduled at fixed delay
    task.when = System.currentTimeMillis() + task.period;
}

-

Java.util.Timer.schedule(TimerTask task, long delay, long period)

task.fixedRate = false;を設定します

Java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)

task.fixedRate = true;を設定します

画面がオフの場合、btwタイマーは機能しません。 AlarmManagerを使用する必要があります。

サンプルがあります: http://developer.Android.com/training/scheduling/alarms.html

1
Hugo