2013-09-04 9 views
48

Qual è il modo più preciso per chiamare una funzione ogni N millisecondi?TimerTask vs Thread.sleep vs Handler postDelayed - il più preciso per chiamare la funzione ogni N millisecondi?

  • Discussione con Thread.sleep
  • TimerTask
  • Handler con postDelayed

ho modificato this example utilizzando Thread.sleep e non è molto preciso.

Sto sviluppando un'applicazione musicale che riprodurrà suoni a un determinato BPM. Capisco che sia impossibile creare un metronomo completamente accurato e non ne ho bisogno, semplicemente cercando il modo migliore per farlo.

Grazie

+0

ho preferito Timer per raggiungere questo –

+0

@BirajZalavadia non utilizzare Timer (http : //www.mopri.de/2010/timertask-bad-d o-it-the-android-way-use-a-handler /), utilizzare Handler o ScheduledThreadPoolExecutor. – AppiDevo

risposta

54

ci sono alcuni svantaggi di usare Timer

  • Si crea solo singolo thread per eseguire i compiti e se un compito richiede troppo tempo per l'esecuzione, altri compiti soffrono.
  • Non gestisce eccezioni generate dalle attività e filo appena termina, che colpisce altre operazioni pianificate e non sono mai eseguiti

offerte ScheduledThreadPoolExecutor correttamente con tutti questi problemi e non ha senso usare Timer .. ci sono due metodi che potrebbero essere utili nel vostro caso .. scheduleAtFixedRate (...) e 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! Grazie mille - questo è quasi impeccabile! Tempi significativamente migliori rispetto al mio vecchio metodo – fxfuture

+0

Sto provando questo metodo per un'attività periodica, ma non sembra funzionare http://stackoverflow.com/questions/27872016/scheduledthreadpoolexecutor-for-a-periodic-task-using- retrofit-just-tiro-onc – dowjones123

-9

Uso TimerTask per l'azione ciclo è quello migliore. Consiglia

+12

Su quali basi? – JustWork

+2

Ne dubito seriamente, controlla questo http://androidtrainningcenter.blogspot.in/2013/12/handler-vs-timer-fixed-period-execution.html – headsvk

1

Sono tutti della stessa precisione. La precisione della temporizzazione Java è soggetta alla precisione e all'accuratezza dei timer di sistema e degli scheduler e non è garantita. Vedi API Thread.sleep e Object.wait.

7

Su Android è possibile creare Thread con il proprio gestore/Coda messaggi. È abbastanza preciso Quando vedi Handler documentation puoi vedere che è stato progettato per questo.

Esistono due usi principali per un gestore: (1) per pianificare i messaggi e le eseguibili da eseguire come punto nel futuro; e (2) per accodare un'azione da eseguire su un thread diverso rispetto al proprio.

Problemi correlati