2016-10-22 181 views
0

在我的應用程序我每秒將數據寫入CSV文件。爲此,我正在使用帶有postAtTime的處理程序。只要屏幕處於打開狀態,此工作正常。數據幾乎每秒都會被寫入。例如,數據看起來像這樣(seconds.milliseconds):Android應用程序時間延遲當應用程序在後臺運行

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

正如你所看到的,差異總是一秒加幾毫秒,這非常好。

不過,如果你關閉屏幕或者回到主屏幕(每次的onPause()被調用)處理程序仍在運行,但有更顯著延遲:

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

這次延時大概是40毫秒。 如果我再次切換到應用程序或重新打開屏幕,則延遲時間會再次縮短(一個或兩個毫秒)。 當應用程序在後臺運行或者這是一個android限制時,有沒有辦法避免這種延遲? 比使用處理程序有更好/更精確的可能性嗎?

這是的onResume()方法的代碼:

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方法初始化:

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

的csvWriter是輸入com的。 opencsv.CSVWriter.CSVWriter。

onPause()和onStop()是空的。

謝謝!

回答

0

這個錯誤實際上是在每次運行中獲取currentTime。相反,現在我只在onCreate()中獲取currentTime,然後僅將1000ms時間段添加到runAtTime。

在的onCreate()

this.runAtTimeRefresh = SystemClock.uptimeMillis(); 

RUN()

runAtTime += 1000; 
writeToCSV(); 
csvHandler.postAtTime(this, runAtTime);