2013-01-21 42 views
0

我試圖通過使用scheduleatfixedrate來調整時間序列。 但是,當我創建這個代碼塊時,我不知道在除非定時器被清除之後,不能改變它被執行後的時間段。調整TimerTask間隔

這是我在一個有序的一系列事件的嘗試:

@Override 
protected void onStart() 
{ 


    super.onStart(); 

    Timer timer = new Timer(); 
    GregorianCalendar gCal = (GregorianCalendar) GregorianCalendar.getInstance(); 




    final Runnable countDivision = new Runnable() 
    { 
     public void run() 
     { 

      /** 
      * Starts the sequence and wraps around when reached the last position 
      */ 

      if(playSequenceButton.isChecked()) 
      { 
       setEnabled(true); 
       int length = sequencer.getLength(); 
       int i = sequencer.getPosition(); 
       DIODE[i].setChecked(true); 
       if(i > 0) 
        DIODE[i-1].setChecked(false); 
       if (i < 1) 
        DIODE[length].setChecked(false); 



      } 
      /** 
      * Stops and resets the sequence 
      */ 
      else 
      { 
       for (int i = 0; i < sequencer.getLength(); i++) 
        DIODE[i].setChecked(false); 

       sequencer.setPosition(START_POSITION); 
       setEnabled(false); 

      } 
     } 
    }; 

    int millis = 999 - gCal.get(GregorianCalendar.MILLISECOND); 
    int inputBPM = TEMPO; 
    long qtrN=Math.round(((60000/inputBPM))*100000)/100000; 

    long sixteenN = (qtrN/4); 
    sixteenN=Math.round(sixteenN*100000)/100000; 


    timer.scheduleAtFixedRate(new TimerTask() 
    { 

     @Override 
     public void run() 
     { 
      //    setEnabled(true); 
      runOnUiThread(countDivision);    

     } 

    }, 0, sixteenN); 



} 

你會推薦設置可動態改變一段時間的什麼方法? 在runnable countDivision正在運行時,16N變量需要能夠改變。 也許一個timertask不是正確的工具?

問候 /M

+0

每次都使用一個新的定時器。或者使用一個非常明顯的報警管理器 – njzk2

+0

我甚至都沒有看到它。謝謝!但是,這會導致事件以兩個不同的間隔運行。我想我需要取消以前的計時器,但這給了我一個nullpointerexception。 – hacke

回答

1

只是取消並重新安排TimerTask的!

+0

我在格式化和放置什麼的一些問題之後就這麼做了。 現在工作正常。 ^^ – hacke

1

我會避免TimerTask並使用Handler來代替。 Handler對於跨線程通信,延遲和定時器非常有用,而且使用起來非常簡單。

下面的例子說明如何創建一個定時事件循環與處理程序: -

public class HandlerExampleActivity extends Activity { 
    private static final String TAG = HandlerExampleActivity.class.getSimpleName(); 

    private static final int MSG_PING = 1; 
    private static final long MSG_DELAY = 1000; 

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

     ping(); 
    } 

    void ping() { 

     Log.d(TAG, "Ping!"); 

     mHandler.sendEmptyMessageDelayed(MSG_PING, MSG_DELAY); 
    } 

    void pong() { 
     Log.d(TAG, "Pong!"); 

     ping(); 
    } 

    private Handler mHandler = new Handler() { 
     public void handleMessage(android.os.Message msg) { 
      if(msg.what == MSG_PING) { 
       pong(); 
      } 
     }; 
    }; 
} 

在Android中,處理程序都去,如果你想定時事件,也有可以使用幾個選項的正確方法將消息發送到一個處理程序,你甚至可以使用的Runnable: -

mHandler.sendEmptyMessage(MSG_PING); // Send ping (almost) immediately 
    mHandler.sendEmptyMessageAtTime(MSG_PING, 
          SystemClock.uptimeMillis() + MSG_DELAY); // one second from now 
    mHandler.postAtTime(new Runnable() { // Even post runnables! 
     @Override 
     public void run() { 
      // TODO Something... 
     } 
    }, MSG_DELAY);  

您可以使用能夠動態改變你想要做什麼的間隔更換MSG_DELAY。