Android,使用Timer在不同时间执行任务?

时间:2016-08-17 11:48:17

标签: android timer

我搜索了其他帖子,但我没有找到符合我问题的案例,所以请不要将我推荐给其他帖子。

我列出了数百个不同的时间,如下表所示:

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

假设它们保存在arraylist中。这意味着一些任务必须在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);

但这显然是以固定利率运作的!

2 个答案:

答案 0 :(得分: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);
    }

答案 1 :(得分:0)

请勿使用Timer代替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);
}

您会注意到日志按照列表中的延迟打印。