0

コードを一定間隔で実行する必要があります。10 秒間隔、5 分間間隔の場合もあります。コードは、開始から正確に 10 秒、次に開始から正確に5 分 10 秒で実行する必要があります。
クロノメーターは開始から時を刻んでいるため、実行時間は正確でなければなりません。

コードの実行には時間がかかる可能性があるため、使用Handler.postDelayedは機能しません。その場合、コードの次の実行が遅れる可能性があります。

を実装したいと思ったときAlarmManager、メモを見ました

Alarm Manager は、アプリケーションが現在実行されていない場合でも、特定の時間にアプリケーション コードを実行したい場合を対象としています。通常のタイミング操作 (ティック、タイムアウトなど) では、Handler を使用する方が簡単で効率的です。

だから私は少し混乱しています.正しい実行を保証するにはどうすればよいですか?

4

5 に答える 5

1

この投稿を見てください:時間/日付変更リスナー。setRepeating()メソッドを使用するか、実行するたびにタイマーを再設定することもできます。

于 2012-06-24T17:22:33.443 に答える
1

Android はハード リアルタイム OS ではないため、カーネルを大幅に変更しない限り、正確なタイミングで実行することはできません。その場合でも、典型的な Android デバイスでは、有用な I/O を正確にタイミングを合わせて実行する方法がほとんどないため、完璧なタイミングでコードを実行するだけでは不十分な場合があります。

せいぜい、より信頼性の高いタイマーを使用して、コードが実行された可能性のある最新のポイントを判断し、事後の補償措置を講じることができます。

利用可能なタイミング方法に関して、主な考慮事項は、デバイスをスリープから復帰させてイベントを実行する場合、アラーム マネージャを使用する必要があることです。 Wake Lock を使用するか、デバイスが起動していて、サービスまたはアクティビティが実行されているときにのみイベントが発生しても問題ない場合は、単純なタイマーを使用できます。

于 2012-06-24T17:54:30.767 に答える
1

アプリケーションの実行中にコードを実行するか、バックグラウンド サービスとして実行するかを指定しませんでした。デバイスをロックすると、Android はスリープ モードになり、CPU がオフになり、postDelayed などの機能がアクティブ化されなくなるため、これは重要です。活動を始めたいという意向も。しかし、AlarmManager ブロードキャストはそうします。ここから引用します

AlarmManager は、アプリケーションが開いていないときでも実行する必要があるタスクに最適です。アプリケーションの使用中に実行する必要がある通常のタイミング操作 (ティック、タイムアウトなど) では、ハンドラーの postDelayed() および postAtTime() メソッドを使用する方が効率的です。AlarmManager は、この方法で使用することを正当化するには、あまりにも多くのオーバーヘッドを必要とします。

于 2014-07-24T11:16:49.223 に答える
1

Chris が述べたように、Android には正確なタイミングなどありません。

しかし、このようにしてリアルタイムに近づけることができます...

5 秒待機するための擬似コード:

class mJob implements Runnable{
   public void run(){
      while(System.currentTimeMillis()<myExactTime){ //poll for your time
         Thread.sleep(1);
      }
      //Ok, we are as near as we'll ever get
      //call here your 'realtime' function or whatever you need
   }
}

 mHandler.postDelayed(mJob,4950); //the closer to 5000, the better for the cpu but you could miss your `myExactTime`

これがどれほど正確かはわかりません。試してみる必要があります。しかし、通常の SDK でより「リアルタイム」になる方法は他にないと思います。を削除して、sleep(1)にさらに近づけることもできますmyExactTime

次の呼び出しでは、次のようなものを使用します (スクラッチ):

nextCallDelayInMillis = starttimeInMillis+No1_Delay+No2_Delay-System.currentTimeMillis();

于 2012-06-24T18:09:37.030 に答える
0

ハンドラーへのポストには、ハンドラーが新しいスレッドを開き、コードが同時に実行されているため、postDelay を使用することをお勧めします。

private Runnable mUpdateTimeTask = new Runnable() {
public void run() {

//some code

mHandler.postDelayed(this, 1000);
}
};

カウント ダウン タイマーを表示するために postDelay を使用した完全なコードを次に示します。

また、ここでは AlarmManger を使用していますが、残りはアプリケーションを閉じたときに通知バーにメッセージを表示するためだけです。

于 2012-06-24T17:50:01.657 に答える