如何模拟延迟?

How to simulate a delay?

我想让我的 Android 应用程序进行自动演示,因此在用户单击 "Auto Demo" 按钮后,它会切换到视图并延迟一秒钟,然后单击该按钮上的按钮查看,然后 2 秒后单击该屏幕上的另一个按钮.. 依此类推,我的 java 代码如下所示:

  private class AutoDemoListener implements View.OnClickListener
  {
    public void onClick(View v)
    {
      Is_AutoDemo_B=true;
      Out("AutoDemoListener");
      switchView(demoView, registrationView);
      startRegistration();

      Thread t = new Thread(new Runnable()
      {
        @Override
        public void run()
        {
          runOnUiThread(new Runnable()
          {
            @Override
            public void run()
            {
              try
              {
                registrationView.symbolButton[2][8].performClick();
                Thread.sleep(1000);
                registrationView.symbolButton[4][13].performClick();
                Thread.sleep(2000);
                registrationView.symbolButton[0][1].performClick();
                Thread.sleep(1000);
                registrationView.symbolButton[6][18].performClick();
              }
              catch (InterruptedException e) { e.printStackTrace(); }
            }
          });
        }
      });
      t.start();
      Is_AutoDemo_B=false;
    }
  }

但它现在做的是:等待 4 秒并一次模拟所有 4 次点击,因此每次点击之间没有延迟,正确的做法是什么?

TimeUnit.SECONDS.sleep(1); 参见 How do I make a delay in Java? is also in Android https://developer.android.com/reference/java/util/concurrent/TimeUnit

也许会生成新线程,在这些子线程中休眠并阻塞主线程直到子线程出现 returns。 @Tenfour04 的回答与我认为生成线程的概念类似......

您必须在后台执行延迟,并且每次 post 结果返回 UI。

您可以使用处理程序执行此操作。 UI 线程已经附带了一个准备好的 Looper,可以让您轻松使用 Handler(其他线程没有,需要更多设置)。

runnable 的嵌套看起来很讨厌,所以这里只是增加了延迟:

private class AutoDemoListener implements View.OnClickListener
  {
    public void onClick(View v)
    {
      Is_AutoDemo_B=true;
      Out("AutoDemoListener");
      switchView(demoView, registrationView);
      startRegistration();
      final Handler handler = new Handler();

      registrationView.symbolButton[2][8].performClick();

      handler.postDelayed(new Runnable() {
          public void run() {
            registrationView.symbolButton[4][13].performClick();
          }
        }, 1000);

      handler.postDelayed(new Runnable() {
          public void run() {
            registrationView.symbolButton[0][1].performClick();
          }
        }, 3000);

      handler.postDelayed(new Runnable() {
          public void run() {
            registrationView.symbolButton[6][18].performClick();
          }
        }, 5000);

      handler.postDelayed(new Runnable() {
          public void run() {
            Is_AutoDemo_B=false;
          }
        }, 5100);

    }
  }

在 Kotlin 中,使用协程可能会更简洁:

val autoDemoListener = View.OnClickListener {
        Is_AutoDemo_B = true
        Out("AutoDemoListener")
        switchView(demoView, registrationView)
        startRegistration()
        CoroutineScope(Job() + Dispatchers.Main).launch {
            registrationView.symbolButton[2][8].performClick()
            delay(1000)
            registrationView.symbolButton[4][13].performClick()
            delay(2000)
            registrationView.symbolButton[0][1].performClick()
            delay(1000)
            registrationView.symbolButton[6][18].performClick()
            Is_AutoDemo_B=false
        }
    }