如何为forloop中的每个循环设置计时器?

时间:2018-04-16 11:02:14

标签: android for-loop timer

为每个循环设置计时器意味着如果数组中有3个项目并且访问那些我们需要调用forloop的项目。我想要的是当第一个循环运行时它应该运行到特定的时间。然后第二个循环以给定的特定时间运行。我已经尝试使用Handler延时,但它无法正常工作。在Handler中,所有循环立即运行,但在特定时间后执行。我不知道如何为每个循环设置计时器。

 {
    "tp_id": 85,
    "id": 15,
    "therapy_type": 1,
    "mode": 0,
    "level": 5,
    "duration": 7
  },
  {
    "tp_id": 85,
    "id": 16,
    "therapy_type": 2,
    "mode": 3,
    "level": 4,
    "duration": 1
  },
  {
    "tp_id": 85,
    "id": 17,
    "therapy_type": 1,
    "mode": 3,
    "level": 4,
    "duration": 1
  }

我正从这些上面的数组中访问持续时间值,并希望以特定的持续时间运行每个循环。我试着延时但不能按我的意愿工作。

   for(int i=0;i<type.size();i++){

                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        Log.e("chekkk",""+i);
                    }
                }, duration.get(i) * 1000);
            }

2 个答案:

答案 0 :(得分:0)

尝试发布Runable本身。

//Handler should be saved in object or other way. 
//You must remove all timers and destory it exciplit. 
//Otherwise the Handler and Timers will be leak.
Handler mTimerHandle = new Handler(); 
Long startTime = System.currentTimeMillis();
//...
for(int i=0;i<type.size();i++){
    Runable timer; //You can save it if you want to cancel it.
    long timerDuration = long(duration.get(i) * 1000); //make a variable in for-loop's scope instead i;
    timer = new Runnable() {
        @Override
        public void run() {
            Log.e("chekkk",""+i);
            long nextEmit = (System.currentTimeMillis() - startTime) % timerDuration;
            long passedTime = ((System.currentTimeMillis() - startTime) / timerDuration ) * timerDuration;
            mTimerHandle.postAtTime(timer, passedTime  + nextEmit);
        }
    };

    mTimerHandle.postAtTime(timer , startTime + timerDuration);
}

答案 1 :(得分:0)

代码

a:如果第一个持续时间是7并且乘以1000 = 7000 = 7s

b:如果第二个是2并且乘以1000 = 2000 = 2s

2秒后(b)跑步,经过7秒或5秒后b(a)跑完

如果你想(b)在你应该在(b)的持续时间内进行数学计算后被解雇!

例如,如果a的延迟等于7s比b的延迟后应该等于(7 + 2)

您可以像这样编辑代码:

 int totalDuration=0;

 for(int i=0;i<type.size();i++){

                totalDuration+=duration.get(i);

                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        Log.e("chekkk",""+i);
                    }
                }, totalDuration * 1000);
            }