2016-10-22 4 views
0

in meiner App Ich schreibe Daten in eine CSV-Datei jede Sekunde. Ich benutze einen Handler mit postAtTime für diesen Zweck. Dies funktioniert solange der Bildschirm eingeschaltet ist. Die Daten werden fast genau jede Sekunde geschrieben. Zum Beispiel sieht die Daten wie folgt (Sekunden.Millisekunden):Android Handler Timing verzögert, wenn App im Hintergrund läuft

  • 24,288
  • 25,293
  • 26,293
  • 27,293
  • 28,298
  • 28,296

Wie Sie sehen können Der Unterschied ist immer eine Sekunde plus ein paar Millisekunden, was völlig in Ordnung ist.

Allerdings, wenn Sie den Bildschirm ausschalten, oder Sie gehen zurück zum Startbildschirm (jedes Mal onPause() aufgerufen wird) der Handler noch läuft, aber mit einer erheblichen Verzögerung:

  • 30,610
  • 31,651
  • 32,690
  • 33,715
  • 34,751
  • 35,791

Diesmal beträgt die Verzögerung etwa 40 ms. Wenn ich wieder zur App wechsle oder den Bildschirm wieder einschalte, ist die Verzögerung wieder minimal (ein oder zwei ms). Gibt es eine Möglichkeit, diese Verzögerung zu vermeiden, wenn die App im Hintergrund läuft oder ist dies eine Android-Beschränkung? Gibt es eine bessere/genauere Möglichkeit als die Verwendung eines Handlers?

Dies ist der Code in der onResume() Methode:

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

Die csvWriter ist vom Typ 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 wurde mit 0

writeToCSV Verfahren initialisiert. opencsv.CSVWriter.CSVWriter.

onPause() und onStop() sind leer.

Danke!

Antwort

0

Der Fehler war eigentlich, die aktuelle Zeit bei jedem Lauf zu bekommen. Stattdessen erhalte ich jetzt nur einmal currentTime in onCreate() und füge dann einfach den 1000ms-Zeitraum zu runAtTime hinzu.

in onCreate()

this.runAtTimeRefresh = SystemClock.uptimeMillis(); 

run()

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