当应用程序在后台运行时,Android Handler计时延迟



在我的应用程序中,我每秒钟都将数据写入CSV文件。为此目的,我使用带有postAtTime的处理程序。只要屏幕打开,这就可以正常工作。数据几乎每秒钟都精确地写入。例如,数据看起来像这样(seconds.milliseconds):

    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毫秒。如果我再次切换到应用程序或打开屏幕,延迟将再次最小化(1或2毫秒)。当应用程序在后台运行时,是否有办法避免这种延迟,或者这是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()为空。

谢谢!

错误实际上是在每次运行时获得currentTime。相反,现在我只得到currentTime一次在onCreate(),然后只是添加1000ms周期到runAtTime。

在onCreate ()

this.runAtTimeRefresh = SystemClock.uptimeMillis();

run ()

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

最新更新