2013-09-04 54 views
48

Cách chính xác nhất để gọi hàm là mỗi N mili giây là gì?TimerTask vs Thread.sleep vs Handler postDelayed - chính xác nhất để gọi hàm mỗi N mili giây?

  • Chủ đề với Thread.sleep
  • TimerTask
  • Handler với postDelayed

tôi sửa đổi this example sử dụng Thread.sleep và nó không phải là rất chính xác.

Tôi đang phát triển ứng dụng nhạc sẽ phát âm thanh tại BPM đã cho. Tôi hiểu không thể tạo ra một nhịp chính xác hoàn toàn và tôi không cần - chỉ cần tìm cách tốt nhất để làm điều này.

Cảm ơn

+0

tôi ưa thích Timer để đạt được điều này –

+0

@BirajZalavadia không sử dụng Timer (http : //www.mopri.de/2010/timertask-bad-d o-it-the-android-cách-sử dụng-một-xử lý /), sử dụng Handler hoặc ScheduledThreadPoolExecutor. – AppiDevo

Trả lời

54

Có một số nhược điểm của việc sử dụng hẹn giờ

  • Nó tạo ra chỉ sợi đơn để thực hiện các nhiệm vụ, nếu một nhiệm vụ mất quá nhiều thời gian để chạy, các nhiệm vụ khác đau khổ.
  • Nó không xử lý ngoại lệ ném bởi nhiệm vụ và sợi chỉ chấm dứt, mà ảnh hưởng đến nhiệm vụ theo lịch trình khác và họ không bao giờ chạy giao ScheduledThreadPoolExecutor

đúng với tất cả những vấn đề này và nó không có ý nghĩa để sử dụng Timer .. có hai phương pháp mà có thể được sử dụng trong trường hợp của bạn .. scheduleAtFixedRate (...) và 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

Thật tuyệt vời! Cảm ơn bạn rất nhiều - điều này gần như hoàn hảo! Thời gian tốt hơn đáng kể so với phương pháp cũ của tôi – fxfuture

+0

Tôi đang thử phương pháp này cho một tác vụ định kỳ, nhưng nó dường như không hoạt động http://stackoverflow.com/questions/27872016/scheduledthreadpoolexecutor-for-a-periodic-task-using- retrofit-just-firing-onc – dowjones123

-9

Sử dụng TimerTask cho hành động vòng lặp là tốt hơn. Đề xuất

+12

Trên cơ sở nào? – JustWork

+2

Tôi nghiêm túc nghi ngờ điều đó, hãy kiểm tra http://androidtrainningcenter.blogspot.in/2013/12/handler-vs-timer-fixed-period-execution.html – headsvk

1

Tất cả đều giống nhau về độ chính xác. Độ chính xác thời gian của Java phụ thuộc vào độ chính xác và độ chính xác của bộ hẹn giờ và lịch trình hệ thống và không được đảm bảo. Xem Thread.sleep và Object.wait API.

7

Trên Android, bạn có thể tạo Chủ đề với Hàng đợi xử lý/Tin nhắn riêng. Nó khá chính xác. Khi bạn thấy Handler documentation bạn có thể thấy, nó được thiết kế cho điều đó.

Có hai cách sử dụng chính cho Trình xử lý: (1) để lên lịch cho các tin nhắn và runnables được thực hiện như một số điểm trong tương lai; và (2) để enqueue một hành động được thực hiện trên một thread khác với của riêng bạn.

Các vấn đề liên quan