2017-07-27 12 views
1

私は遅延を実行し、このコードを持っている:ハンドラ遅延が一様ではありませんか?

final Handler handler = new Handler(); 
    final int delay = 1000; //milliseconds 
    handler.postDelayed(new Runnable(){ 
     public void run(){ 
      handler.postDelayed(this, delay); 
      Log.e("LOG","HIT"); 
     } 
    }, delay); 

及びこれらのログ・ステートメントを受け取る:

07-27 19:02:00.084 1690-1690/com.example.steinbockapplications.myapplication2 E/LOG: HIT 
07-27 19:02:02.089 1690-1690/com.example.steinbockapplications.myapplication2 E/LOG: HIT 
07-27 19:02:03.092 1690-1690/com.example.steinbockapplications.myapplication2 E/LOG: HIT 
07-27 19:02:25.154 1690-1690/com.example.steinbockapplications.myapplication2 E/LOG: HIT 
07-27 19:02:26.155 1690-1690/com.example.steinbockapplications.myapplication2 E/LOG: HIT 

ので、何がこれらの遅延でアップだ、それはすべての1000ミリ秒を実行する必要があります考え出し?

答えて

3

こんにちは@Johnny Rockex私は少し修正を加えて同じコードを実行しました。

07-27 22:50:19.999 18973-18973/com.jingged.mermaids E/LOG: HIT 
07-27 22:50:21.000 18973-18973/com.jingged.mermaids E/LOG: HIT 
07-27 22:50:22.001 18973-18973/com.jingged.mermaids E/LOG: HIT 
07-27 22:50:23.002 18973-18973/com.jingged.mermaids E/LOG: HIT 
07-27 22:50:24.003 18973-18973/com.jingged.mermaids E/LOG: HIT 
07-27 22:50:25.005 18973-18973/com.jingged.mermaids E/LOG: HIT 
07-27 22:50:26.006 18973-18973/com.jingged.mermaids E/LOG: HIT 
07-27 22:50:27.007 18973-18973/com.jingged.mermaids E/LOG: HIT 
07-27 22:50:28.008 18973-18973/com.jingged.mermaids E/LOG: HIT 
07-27 22:50:29.009 18973-18973/com.jingged.mermaids E/LOG: HIT 

とコード

final Handler handler = new Handler(); 
    final int delay = 1000; //milliseconds 
    handler.postDelayed(new Runnable(){ 
     public void run(){ 
      Log.e("LOG","HIT"); 
      handler.postDelayed(this, delay); 
     } 
    }, delay); 

実際にログ・メソッドの前にそれを遅らせています。これは、実行メソッドのハンドラの最後の行である必要があります。

+0

まあ、違いはないと思った、ハンドラは実行する時間が必要だと思いますか? Xcodeで私はそれがほぼ同期していることを期待するでしょう - それがあなたの命令で動作することを証言することができます。 –

1

場合によってはHandlerに矛盾があります。正確な結果が必要な場合は、TimerTaskとなります。

HandlerおよびThreadは、正確な時刻に実行することを保証するものではありません。

1

ハンドラがスリープモードになると、CPUが停止してハンドラが停止します。

ハンドラ& Runnableはスリープ状態の電話機では動作しませんので、AlarmManagerを調べるか、フォアグラウンドサービスを使用してください。

関連する問題