2013-09-04 6 views
48

Was ist der genaueste Weg, eine Funktion alle N Millisekunden aufzurufen?TimerTask vs Thread.sleep vs Handler postDelayed - am genauesten Funktion alle N Millisekunden aufrufen?

  • Thema mit Thread.sleep
  • Timertask
  • Handler mit postDelayed

I modifizierte this example Thread.sleep verwenden und es ist nicht sehr genau.

Ich entwickle eine Musik-App, die Sounds bei einem bestimmten BPM abspielen wird. Ich verstehe, dass es unmöglich ist, ein vollkommen genaues Metronom zu erstellen, und das muss ich auch nicht - ich suche nur nach dem besten Weg, dies zu tun.

Dank

+0

I Timer bevorzugt diese –

+0

@BirajZalavadia zu erreichen verwenden Sie Timer nicht (http : //www.mopri.de/2010/timertask-bad-d Verwenden Sie Handler oder ScheduledThreadPoolExecutor. – AppiDevo

Antwort

54

Es gibt einige Nachteile der Timer mit

  • Es nur einzelne Thread erstellt, die Aufgaben auszuführen und wenn eine Aufgabe dauert zu lange laufen, leiden andere Aufgaben.
  • Es behandelt nicht von Aufgaben geworfen Ausnahmen und Faden endet nur, was andere geplante Aufgaben auswirkt und sie laufen nie

ScheduledThreadPoolExecutor Angebote richtig mit all diesen Fragen, und es macht keinen Sinn, Timer zu verwenden, .. Es gibt zwei Methoden, die die Verwendung in Ihrem Fall sein könnte .. scheduleAtFixedRate (...) und scheduleWithFixedDelay (..)

class MyTask implements Runnable { 

    @Override 
    public void run() { 
    System.out.println("Hello world"); 
    } 
} 

ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1); 
long period = 100; // the period between successive executions 
exec.scheduleAtFixedRate(new MyTask(), 0, period, TimeUnit.MICROSECONDS); 
long delay = 100; //the delay between the termination of one execution and the commencement of the next 
exec.scheduleWithFixedDelay(new MyTask(), 0, delay, TimeUnit.MICROSECONDS); 
+0

Wow! Vielen Dank - das ist fast makellos! Deutlich besseres Timing als meine alte Methode – fxfuture

+0

Ich versuche diese Methode für eine periodische Aufgabe, aber es scheint nicht zu funktionieren http://stackoverflow.com/questions/27872016/scheduledthreadpoolexecutor-for-a-periodic-task-using- Retrofit-Just-Firing-Onc – dowjones123

-9

Mit Timertask für die Schleife Aktion ist die bessere. Empfehlen

+12

Aus welchen Gründen? – JustWork

+2

Ich bezweifle ernsthaft, überprüfen Sie diese http://androidtrainningcenter.blogspot.in/2013/12/handler-vs-timer-fixed-period-execution.html – headsvk

1

Sie sind alle die gleiche Präzision. Java-Timing-Genauigkeit unterliegt der Genauigkeit und Genauigkeit von System-Timern und Schedulern und ist nicht garantiert. Siehe Thread.sleep und Object.wait API.

7

Auf Android können Sie Thread mit seiner eigenen Handler/Message Queue erstellen. Es ist ziemlich genau. Wenn Sie Handler documentation sehen, können Sie sehen, dass es dafür entworfen wurde.

Es gibt zwei Hauptverwendungszwecke für einen Handler: (1) Meldungen und Runnables planen als irgendwann in der Zukunft ausgeführt werden soll; und (2) eine Aktion in einen anderen Thread als Ihre eigene einzufügen.