2

Android (Java) で使用されるこのコードに問題があります

handler.postDelayed(new Runnable(){
public void run(){
    // Your code goes here...
}
}, 500);

遅延が約 500 ミリ秒の場合、プログラムは 0.5 秒でタスクを繰り返すように見えますが、100 ミリ秒未満またはそれ以下に変更すると、それ以上追従しなくなります。明るさの変化をテストすると、しばらくの間、その速度で明るさの変化を繰り返すことができますが、その後速度が低下し、通常のフラッシュ速度に戻ります。不安定なようです。電話の CPU の負荷に関係なく、正確な遅延を与えるコードはありますか。

どうもありがとう

4

2 に答える 2

5

Java からではありません。ストック Java はリアルタイム システムではありません。

タイミングの精度は、JVMOS のスケジューラの気まぐれに左右されます。段階的に精度を上げることができるかもしれませんが、探している種類の精度が保証されるわけではありません。

于 2012-09-04T22:39:56.687 に答える
0

周期的なティックを持つ 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();
于 2012-09-04T23:04:58.283 に答える