2016-10-22 9 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 имеет тип ком. opencsv.CSVWriter.CSVWriter.

onPause() и onStop() пусты.

Спасибо!

ответ

0

Ошибка в том, чтобы получить текущее время на каждом прогоне. Вместо этого теперь я получаю currentTime только в onCreate(), а затем просто добавляю период 1000ms для runAtTime.

в OnCreate()

this.runAtTimeRefresh = SystemClock.uptimeMillis(); 

запуска()

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

 Смежные вопросы

  • Нет связанных вопросов^_^