应用在后台运行时,Android处理程序时间延迟

时间:2016-10-22 17:46:45

标签: android android-handler opencsv

在我的应用中,我每秒都会将数据写入CSV文件。为此,我正在使用带有postAtTime的Handler。只要屏幕打开,这样就可以正常工作。几乎每秒都会写入数据。例如,数据看起来像这样(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毫秒。 如果我再次切换到应用程序或重新打开屏幕,延迟再次最小(一或两毫秒)。 当应用程序在后台运行时,有没有办法避免这种延迟,或者这是一个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()为空。

谢谢!

1 个答案:

答案 0 :(得分:0)

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

onCreate()

中的

this.runAtTimeRefresh = SystemClock.uptimeMillis();

run()

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