为每个循环设置计时器意味着如果数组中有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);
}
答案 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);
}