2015-02-20 17 views
5

Tôi có phiên bản sửa đổi của ứng dụng mẫu trò chuyện qua bluetooth. Tôi đã thiết lập một số ScheduledExecutorService gửi lệnh qua bluetooth với tốc độ được xác định trước bằng cách sử dụng scheduleAtFixedRate.Làm cách nào để thay đổi tốc độ hoặc thời gian của tác vụ lặp lại bằng cách sử dụng ScheduledExecutorService?

Tôi đã thiết lập một số PreferenceActivity để cho phép khoảng thời gian được người dùng sửa đổi. Nhưng tôi không chắc chắn làm thế nào để có được các nhiệm vụ lặp lại thực tế xảy ra với thời gian cập nhật. Tôi có cần hủy và khởi động lại ScheduledExecutorService bằng cách nào đó không?

Đây là các phần có liên quan của mã của tôi.

private ScheduledExecutorService scheduleTaskExecutor; 

public long ReadInterval = 1; 

...  

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
     scheduleTaskExecutor = Executors.newScheduledThreadPool(5); 
... 
    // This schedule a task to run every 1 second: 
    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() { 
     public void run() { 


     // If you need update UI, simply do this: 
     runOnUiThread(new Runnable() { 
      public void run() { 
      // update your UI component here. 
       if (connected == true) { 
        sendMessage("READ");     
        if (D) Log.i(TAG, "In Run!");     
       } 
      } 
     }); 
     } 
    }, 0, ReadInterval, TimeUnit.SECONDS);  
    } 

Và tôi đang cố cập nhật ReadInterval tại đây. ReadInterval đang được cập nhật nhưng khoảng thời gian lệnh định kỳ không được cập nhật.

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (D) 
     Log.d(TAG, "onActivityResult " + resultCode); 
    switch (requestCode) { 
    case REQUEST_CONNECT_DEVICE: 
... 
    case REQUEST_ENABLE_BT: 
... 
    case REQUEST_SETTINGS: 
     // When returning from settings activity 
     SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); 
     String Pref = sharedPref.getString(SettingsActivity.KEY_PREF_READINTERVAL, ""); 
     ReadInterval = Long.valueOf(Pref); 
     Toast.makeText(this, Pref, 
        Toast.LENGTH_SHORT).show(); 

     Log.d(TAG, "Settings Activity Result"); 
    } 
} 
+0

xem bài đăng sau đâyhttp: //stackoverflow.com/questions/1519091/scheduledexecutorservice-with-variable-delay – sasankad

Trả lời

9

Tôi cải thiện câu trả lời một chút (chủ yếu là vì tôi cũng phải sử dụng ScheduledExecutorService). Vui lòng sử dụng mã này thay vì mã trước tôi đã đăng, vì mã trước đó thực sự có hiệu suất, vì không có lý do chính đáng.

private ScheduledExecutorService scheduledExecutorService; 
private ScheduledFuture<?> futureTask; 
private Runnable myTask; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    // Your executor, you should instanciate it once for all 
    scheduledExecutorService = Executors.newScheduledThreadPool(5); 

    // Since your task won't change during runtime, you can instanciate it too once for all 
    myTask = new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      // Your code to run periodically 
     } 
    }; 
} 

/** 
* This method will reschedule "myTask" with the new param time 
*/ 
public void changeReadInterval(long time) 
{ 
    if(time > 0) 
    {  
     if (futureTask != null) 
     { 
      futureTask.cancel(true); 
     } 

     futureTask = scheduledExecutorService.scheduleAtFixedRate(myTask, 0, time, TimeUnit.SECONDS); 
    } 
} 

Bây giờ, để sắp xếp lại nhiệm vụ của bạn trong thời gian chạy, sử dụng phương pháp changeReadInterval(time);

Nó sẽ hủy "hẹn giờ" trước nếu nó đã được thiết lập và sẽ sắp xếp lại một cái mới.

+0

Cảm ơn, điều này đã hiệu quả. – greencardigan

+0

@greencardigan Tôi đã cập nhật câu trả lời bằng mã được cải thiện. Cái trước đó khá tệ và không quá tao nhã! –

+0

Điều này có vẻ tốt hơn. Tuy nhiên, tôi đã phải thay đổi scheduleTaskExecutor = Executors.newScheduledThreadPool (5) thành scheduledExecutorService = Executors.newScheduledThreadPool (5) để làm cho nó hoạt động. – greencardigan

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