2016-08-17 84 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