2016-08-17 77 views
0

我搜索了其他帖子,但沒有找到與我的問題相匹配的案例,因此請不要將我轉到其他帖子。Android,使用計時器在不同時間執行任務?

我有數百個不同的時間的開始等的文章的列表:

timeList = {5,13,21,40,...}。

假設它們保存在一個數組列表中。這意味着某些任務必須在5秒13秒內從起點開始執行。我怎樣才能使用定時器或任何其他方式來實現這一目標? 此外,我可能有像這樣的格式的timeList,如果它有幫助:

timeList = {8:05,8:13,8:21,8:40,...}。

我現在的計時器是這樣的:

timer = new Timer(); 
    timer.scheduleAtFixedRate(new TimerTask() { 

     synchronized public void run() { 
      //do some task 
     } 
    }, startPoint, Period); 

但是,這是在固定的速度明顯在努力!

+0

在run方法內啓動一個啓動點爲5(timeList [0])的計時器,執行任務並啓動一個啓動點爲13(timeList [1])的新計時器,依此類推。 –

+1

應用程序關閉時會發生什麼?定時器不是持久的 –

+0

很好的解決方法。但我認爲必須有一種方法,我把這個列表放到一個計時器上或者像這樣,並且它開始在指定的時間點執行一些任務。@ bigdestroyer – morgan

回答

0

通過使用Timer.schedule(TimerTask task, long delay),設置你所有的計時器和等待它們執行

假設你得到在MM:SS格式(例如:8:58):

ArrayList<String> your_arraylist = new ArrayList<String>(); 
    //your list above, fill it with MM:SS 

    final ArrayList<Long> seconds = new ArrayList<Long>(); 
    final ArrayList<Long> minutes = new ArrayList<Long>(); 
    long first_minute; 

    for (String time : your_arraylist) { 
     minutes.add(Long.parseLong(time.split(":")[0])); 
     seconds.add(Long.parseLong(time.split(":")[1])); 
    } 

    first_minute = minutes.get(0);   

    for (int i = 0; i < seconds.size(); i++) { 
     long waiting_duration; 

     if (seconds.get(i) < Calendar.SECOND) { 
      waiting_duration = (60 - Calendar.SECOND + seconds.get(i)) * 1000; 
     } 
     else { 
      waiting_duration = (seconds.get(i) - Calendar.SECOND) * 1000; 
     } 

     waiting_duration += (minutes.get(i) - first_minute) * 60 * 1000; 

     Timer timer   = new Timer(); 
     TimerTask timer_task = new TimerTask() { 
      @Override 
      public void run() { 
       // do jobs 
      } 
     }; 
     timer.schedule(timer_task, waiting_duration); 
    } 
+0

這是爲了在你的不同時間執行相同的任務。如果你要在不同的秒鐘做不同的工作,讓我知道 –

+0

感謝您的答案。執行timer.schedule(timer_task,waiting_duration)後是否執行for循環的每個循環?如果沒有,那麼它不適用,因爲有大量的時間點! – morgan

+0

是的,但不等待計時器。它只是設置定時器並繼續設置下一個 –

0

不要使用計時器使用Handler代替。

private int[] mTimeList = {5000, 2000, 7000, 4000}; 
private int mCount; 
private int mDelay; 
private Handler mHandler = new Handler(); 



private void initRepeatedTimer() { 
    mHandler.postDelayed(new Runnable() { 
     public void run() { 
      Log.e(TAG, "run: " + mCount); 
      mDelay = mTimeList[mCount]; 
      if (mCount < mTimeList.length - 1) 
       mCount++; 
      else 
       mCount = 0; 
      mHandler.postDelayed(this, mDelay); 
     } 
    }, mDelay); 
} 

您將注意到,日誌按列表中的延遲打印。

+0

如果它的一個很長的過程使用單獨的變量wth值mTimeList.length – shijin

+0

感謝您的答案。但爲什麼不使用Timer?這將是一整天和整個工作日都在運行的服務。是不是一個足夠持久的計時器?如果是這樣,是一個更方便的處理程序? @ yuen-shi – morgan

+0

與Handler相比,定時器內存泄漏的可能性很高。 檢查內存泄漏的lint警告。 檢查內存監視器並確保圖形穩定。據我所知,Timer不能被重新安排。 處理程序是比較好的。如果您使用可以重用的Timer,handler,則必須每次創建新的TimerTask。 另一個解決方案是使用RxAndroid。 如果你對RxAndroid更有信心可以嘗試一下。我是Rx的初學者,所以無法給出解決方案。 – shijin