2015-02-20 21 views
5

Ho una versione modificata della app di esempio della chat Bluetooth. Ho impostato un ScheduledExecutorService che invia un comando via bluetooth a una velocità predefinita utilizzando scheduleAtFixedRate.Come si modifica la frequenza o il periodo di un'attività ricorrente utilizzando ScheduledExecutorService?

Ho impostato un PreferenceActivity per consentire all'utente di modificare il periodo. Ma non sono sicuro di come far accadere i compiti ricorrenti con il periodo aggiornato. Devo annullare e riavviare lo ScheduledExecutorService in qualche modo?

Ecco le parti rilevanti del mio codice.

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);  
    } 

E stavo cercando di aggiornare ReadInterval qui. Il ReadInterval viene aggiornato ma il periodo di comando ricorrente non viene aggiornato.

@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

guardare al seguente post: //stackoverflow.com/questions/1519091/scheduledexecutorservice-with-variable-delay – sasankad

risposta

9

Ho migliorato la risposta un po '(principalmente perché anch'io dovevo usare ScheduledExecutorService). Si prega di utilizzare questo codice al posto del precedente che ho postato, perché il precedente era davvero in prestazioni, senza una buona ragione.

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); 
    } 
} 

Ora, di riprogrammare il vostro compito durante il runtime, utilizzare il metodo changeReadInterval(time);

Sarà annullare il "timer" precedente se è stato impostato e sarà riprogrammare una nuova.

+0

Grazie, ha funzionato. – greencardigan

+0

@greencardigan Ho aggiornato la risposta con codice migliorato. Il precedente era abbastanza cattivo e non così elegante! –

+0

Questo sembra migliore. Tuttavia, ho dovuto cambiare scheduleTaskExecutor = Executors.newScheduledThreadPool (5) a scheduledExecutorService = Executors.newScheduledThreadPool (5) per farlo funzionare. – greencardigan