Как смоделировать задержку? - PullRequest
1 голос
/ 08 января 2020

Я хочу, чтобы мое приложение Android выполняло автоматическую демонстрацию, поэтому после того, как пользователь нажмет кнопку «Автоматическая демонстрация», оно переключится в режим просмотра, задержит секунду и нажмет кнопку в этом представлении, затем 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 нажатия одновременно, так между каждым кликом нет задержки, как это сделать?

Ответы [ 2 ]

1 голос
/ 08 января 2020

Вы должны выполнить задержку в фоновом режиме и каждый раз публиковать результаты в пользовательском интерфейсе.

Это можно сделать с помощью обработчика. Поток пользовательского интерфейса уже поставляется с подготовленным Looper, который позволит вам легко использовать обработчик (другие потоки не требуют и требуют дополнительной настройки).

Вложение runnables выглядело бы неприлично, поэтому здесь просто добавление увеличивающиеся задержки:

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
        }
    }
1 голос
/ 08 января 2020

TimeUnit.SECONDS.sleep(1); см. Как сделать задержку в Java? также в Android https://developer.android.com/reference/java/util/concurrent/TimeUnit

Возможно, создать новые темы, спать в этих дочерних потоках и блокировать основные потоки, пока дочерний поток не вернется. Я думаю, что ответ @ Tenfour04 похож на концепцию нереста ...

...