2016-10-22 9 views
0

私のアプリでは毎秒CSVファイルにデータを書き込みます。私は、この目的のためにpostAtTimeを持つHandlerを使用しています。これは、画面が表示されている限り正常に動作します。データはほぼ毎秒書き込まれます。例えば、データは、この(秒。ミリ秒)のようになります。アプリがバックグラウンドで実行されるとAndroidハンドラのタイミングが遅れる

  • 24.288
  • 25.293
  • 26.293
  • 27.293
  • 28.298
  • 28.296

あなたが見ることができるように、差は常に2番目にプラス数ミリ秒であり、これは完全に良好です。

しかし、あなたは画面をオフにした場合か、ホーム画面に戻ります(毎回onPause()と呼ばれている)ハンドラはまだなく、より大幅な遅延と、実行されている:

  • 30.610
  • 31.651
  • 32.690
  • 33.715
  • 34.751
  • 35.791

今回は遅延が約40msです。 もう一度アプリに切り替えたり、画面を戻したりすると、遅延は最小限に抑えられます(1〜2 ms)。 アプリがバックグラウンドで実行されているとき、またはAndroidの制限があるときに、この遅延を回避する手段はありますか? ハンドラを使用するよりもより正確な可能性がありますか?

これはonResume()メソッドのコードである:

String[] data = {this.simpleDateFormatCSV.format(this.calendar.getTime())};   
this.csvWriter.writeNext(data); 

csvWriterタイプCOMのである:

try { 
     this.csvHandler.removeCallbacksAndMessages(null); 
} catch (Exception e1) { 
} 
this.csvHandler = new Handler(); 
this.csvHandler.postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      long currentTime = SystemClock.uptimeMillis(); 
      if (currentTime > runAtTime) { 
       calendar = GregorianCalendar.getInstance(); 
       runAtTime = currentTime + 1000;     
       writeToCSV(); 
      } 
      csvHandler.postAtTime(this, runAtTime); 
     } 
    }, 0); 

runAtTime 0

writeToCSV方法で初期化されています。 opencsv.CSVWriter.CSVWriter。

onPause()およびonStop()は空です。

ありがとうございます!

答えて

0

実際には、実行ごとにcurrentTimeを取得するのが間違いでした。代わりに、私はonCreate()でcurrentTimeを1回だけ取得してから、runAtTimeに1000msの期間を追加します。

のonCreate()内

this.runAtTimeRefresh = SystemClock.uptimeMillis(); 

実行()

runAtTime += 1000; 
writeToCSV(); 
csvHandler.postAtTime(this, runAtTime); 
関連する問題