2016-05-08 13 views
0

läuft also lieh ich mir einen Timer Ansatz von diesem hervorragenden Beitrag:Meine Android Timer langsam

Android timer? How-to?

, die sehr gut geschrieben und gut upchecked. Ich finde jedoch, dass es ungefähr alle 106-114 ms, nicht die gewünschten 100 ms abfeuert. Macht das Sinn, oder scheint es langsam? Wenn ich das genauer auf 100 ms bringen wollte (ich benutze es an einigen Stellen, um die Dauer zu messen), welche Änderung sollte ich machen?

Mein Code ist unten

Handler timerHandler = new Handler(); 
Runnable timerRunnable = new Runnable() { 

    @Override 
    public void run() { 

     TickTimer_Elapsed(); 
     timerHandler.postDelayed(this, 100); 
    } 
}; 

void TickTimer_Start() { timerHandler.postDelayed(timerRunnable,); } 
void TickTimer_Stop() { timerHandler.removeCallbacks(timerRunnable); } 

void TickTimer_Elapsed() 
{ 
    m_FSM.Tick_10Hz(); // actually a bit slower than 10Hz 

} 
+0

Verwendung 'postAtTime' statt (oder adaptive verwenden "Verzögerung" bei der Verwendung von' postDelayed') – pskink

+0

@pskink Sounds Wie sie sehr genaue Zeiten wollen, verspricht 'postAtTime' auch nicht. – weston

+0

"Ich verwende es an einigen Orten, um die Dauer zu messen" Klingt wie ein [XY-Problem] (http://xyproduk.info/). Was ist das Problem, das Sie versuchen zu lösen? – weston

Antwort

1

Timer Begriff in englischer Sprache überlastet ist, entweder eine Vorrichtung bedeutet, die Zeit (zum Beispiel eine Stoppuhr) misst, oder ein Gerät, das nach einer gewissen Zeit (zum Beispiel Eieruhr) auslöst.

In Android ist der Timer nur für Letzteres, und es verspricht keine absolute Genauigkeit.

„Ich benutze es in einigen Orten Dauern zu messen“

Im wirklichen Leben zu sagen, wie viel Zeit vergangen ist, würden Sie nicht um eine Uhr zu sehen und die Sekunden zählen tickt durch! Sie würden in dieser Zeit nichts anderes tun. Ein effizienter Weg wäre, die Uhr nur zweimal zu betrachten und die beiden Zeiten zu subtrahieren. Das gleiche gilt mit Computern:

zB:

long startTimeMs = System.currentTimeMillis(); 

Später:

long durationMs = System.currentTimeMillis() - startTimeMs; 
+0

verbracht wird über 'android.util.TimingLogger' – pskink

+0

@pskink Das ist für die Protokollierung" Eine Dienstprogrammklasse, um Timings Splits während eines Methodenaufrufs zu protokollieren ", aber ich würde dies nicht für Profiling verwenden, würde ich nur die App richtig mit der IDE Profil – weston

+0

ah ok du bist richtig – pskink