【问题标题】:how to set timer for each loop in forloop?如何为for循环中的每个循环设置计时器?
【发布时间】:2018-04-16 11:02:14
【问题描述】:

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

【问题讨论】:

标签: android for-loop timer


【解决方案1】:

在您的代码中

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

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

2 秒后 (b) 运行,7 秒或 5 秒后 b (a) 运行

如果你想 (b) 在 a 之后被解雇,你应该计算 (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);
            }

【讨论】:

  • 阿米尔,你正确理解了我的问题。你能告诉我如何将时间延迟设置为“a”到“b”的持续时间。那我想我的问题就解决了。
  • @SudhansuSekhar 我编辑了你的代码并在我的回答中添加了让我知道它是否有效
【解决方案2】:

尝试发布 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);
}

【讨论】:

  • WinCloud,它和我的代码完全一样,就像最后执行循环的持续时间更长,但它不应该是这样的。应该就像第一次迭代的持续时间为 7 分钟,那么它应该运行 7 次,然后第二次迭代应该发生,但所有迭代都同时发生
  • @SudhansuSekhar 我已经更新了使用时间点发布的其他方式。它以相同的持续时间发射。
  • @SudhansuSekhar 抱歉,我没有详细阅读问题,我已经更新了“相同持续时间”问题的代码。检查一下。
  • 哦,Wincloud,我会检查并通知您
  • 嗯……等等……你的意思是工作应该这样执行吗?等待 7 秒 - 做 A - 等待 2 秒 - 做 B?
猜你喜欢
  • 2021-02-27
  • 2015-06-27
  • 2021-01-31
  • 2014-08-21
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2021-04-13
  • 2014-04-15
相关资源
最近更新 更多