Android Studio内部循环延迟

时间:2019-02-07 22:24:46

标签: java android delay

我想按用户想要的时间循环播放,但要延迟3秒。

这是代码:

for (i = 0;i < n1; i++){
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(KeyMapCreator.this, "Try number " + i,Toast.LENGTH_SHORT).show(); ActionIwantToDo();
                }
            },3000);
        }

变量i 是用户设置的变量。 问题在于烤面包片不会每3秒显示一次,它就像没有延迟的正常循环一样。我以为是因为烤面包的时间,但是如果我将时间设置为20秒,还是一样。 有人知道如何在循环内进行适当的延迟??

2 个答案:

答案 0 :(得分:0)

处理程序只是安排一些工作以供以后执行。它实际上并没有阻塞当前线程。您要做的只是安排n1个工作项在三秒钟后执行,这些工作将在该确切延迟后按顺序执行。

您实际上根本不想编写代码来阻塞主线程。曾经它将使您的应用似乎无响应。

答案 1 :(得分:0)

您遇到的问题是您的循环会立即创建许多处理程序,并延迟3秒钟,然后显示敬酒。它们不会彼此等待,并且因为它们是在彼此之间的毫秒内创建的,所以它们将同时显示吐司。

我不确定您要完成什么,循环可能不是您想要的。但是,这是一种使吐司在3秒后和之后每3秒显示多次的方法。

为此,我们将使用递归,因为它将实现递归,这样您就不会在主线程上受阻。

  1. 从需要该函数启动的位置调用doSomething(递归函数)(请记住,第二个变量是您要运行它的次数,并且只需要0作为计数器)
doSomething(0, 3)
  1. 创建doSomething
private void doSomething(int i, int n) {
   new Handler().postDelayed(new Runnable() {
      @Override
      public void run() {
         if (i < n) {
            Toast.makeText(KeyMapCreator.this, "Try number " + i,Toast.LENGTH_SHORT).show();
            actionIWantToDo();
            doSomething(i+1, n);
         }
      }
   }, 3000);
}