0

タイマー スケジュール メソッドを使用して、位置情報を 5 分ごとにデータベースに送信します。

コードは次のとおりです。

public void onStart(Intent intent, int startId) 
{
    this.timer.schedule(new Send(), new Date(), TEN_SECONDS*6*5); //ten_seconds = 10000
}

class Send extends TimerTask
{
    public void run()
    {
        String address = LocationService.this.address;
        new SendLocation(LocationService.this.id,address); // a thread that sends the info to the db
        LocationService.this.gpsLocation = null;
        LocationService.this.networkLocation = null;
    }
}

しかし、なぜ私のデータベースには 7/6 分の違いがある場所があるのでしょうか? sendLocation は、データベースに送信する場所が最後の場所と同じかどうかを確認します。真の場合は場所を無視し、それ以外の場合は送信します。

つまり、データベース内の各場所の違いは 5 分のジャンプである必要があります。

4

2 に答える 2

1

メソッドに関するこのリンクを見てください。Timer schedule明確に次のように述べています。

指定されたタスクを、指定された時刻から開始して、固定遅延で繰り返し実行するようにスケジュールします。後続の実行は、指定された期間で区切られたほぼ一定の間隔で行われます。

固定遅延実行では、各実行は、前の実行の実際の実行時間に対して相対的にスケジュールされます。なんらかの理由 (ガベージ コレクションやその他のバックグラウンド アクティビティなど) で実行が遅れると、その後の実行も遅れます。長期的には、実行頻度は通常、指定された期間の逆数よりもわずかに低くなります (Object.wait(long) の基礎となるシステム クロックが正確であると仮定します)。

runあなたのコードでは、 によって実行される重いタスクのために、 のメソッドがSendそのタスクを完了するのに 5 分以上かかる可能性がありますSendLocation Thread。したがって、データベースには7/6分の差がある場所があります。

于 2013-01-22T19:27:40.557 に答える
0

TimerTasksリクエストしたときに正確に実行されるという保証はありません。Timerドキュメントから-

各タイマーには、タスクが順次実行される 1 つのスレッドがあります。このスレッドがタスクの実行でビジー状態になると、実行可能なタスクが遅延する可能性があります。

このクラスは、タスク スケジューリングのリアルタイム性を保証しません。

確かに、2 分は長い時間なので、他の場所で遅延が発生する可能性があります。

于 2013-01-22T19:27:49.183 に答える