周期的なティックを持つ CountDownTimer を使用すると、より正確なことができる場合があります。基本的に、必要に応じて数時間の期間カウントダウンするように設定します。1 つのメソッドが各ティックで呼び出され、もう 1 つのメソッドがタイマーの最後に呼び出され、その時点で別のメソッドを開始できるという 2 つのメソッドがあります。とにかく、ティックを非常に速く設定し、クリックの実際の時間差をチェックして、遅延ポイントでコードを開始するだけです。それがあなたができる最善のことだと思います。基本的にティック内で、適切な時間が実際に経過した場合にシグナルを発行します。そのシグナルは、スレッドを開始するか、すでに実行中のスレッドが待機していたものを解放します。CountDownTimer の値は何ですか。非常に頻繁にポーリングと経過時間のチェックを行うことができると思います。保証されていませんが、ティック間の時間は、高い頻度に設定して、非常に頻繁にチェック/ポーリングすることができます。これにより、リアルタイム システムと同様にスムーズなパフォーマンスが得られます。シグナルを発行するだけで、シグナルを発行するためだけにスレッドのリソースを占有しないため、正確である可能性が高くなります。IntentService を使用してタスクを実行し、各呼び出しで startService(intentToIntentService) を呼び出すこともできます。スレッドをキューに入れる IntentService のようなサービス内でスレッド化がうまく機能するかどうかを確認してください。シグナルを発行するだけで、シグナルを発行するためだけにスレッドのリソースを占有しないため、正確である可能性が高くなります。IntentService を使用してタスクを実行し、各呼び出しで startService(intentToIntentService) を呼び出すこともできます。スレッドをキューに入れる IntentService のようなサービス内でスレッド化がうまく機能するかどうかを確認してください。シグナルを発行するだけで、シグナルを発行するためだけにスレッドのリソースを占有しないため、正確である可能性が高くなります。IntentService を使用してタスクを実行し、各呼び出しで startService(intentToIntentService) を呼び出すこともできます。スレッドをキューに入れる IntentService のようなサービス内でスレッド化がうまく機能するかどうかを確認してください。
Date startDate = new Date();
long startTime = startDate.getTime();
// Tick called every 10th of a second. OnFinish called at Signal.
CountDownTimer ctDownTimer = new CountDownTimer(30000, 100) {
long startIntervalTime=startTime;
public void onTick(long millisUntilFinished) {
Date now = new Date();
long nowTime = now.getTime();
if ((startIntervalTime - nowTime) > 100)
{
issueSignal();
intervalStartTime=nowTime;
}
now=null;
}
public void onFinish() {
Log.d("MyClass", "Done") // Maybe start out.
}
}.start();