Android Studio Задержка внутри цикла - PullRequest
0 голосов
/ 08 февраля 2019

Я хочу сделать цикл, время, которое пользователь хочет, но с задержкой в ​​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 голосов
/ 08 февраля 2019

Ваша проблема в том, что ваш цикл создает сразу несколько обработчиков, которые задерживаются на 3 секунды, а затем показывают тост.Они не ждут друг друга, и поскольку они создаются за миллисекунды друг от друга, они будут показывать тост одновременно.

Я не уверен, чего вы пытаетесь достичь, и циклвероятно не то, что вы хотите.Однако это способ отображения тоста через 3 секунды, а затем через каждые 3 секунды несколько раз.

Для этого мы будем использовать рекурсию, потому что она сделает так, чтобы вы не блокировались наосновной поток.

  1. Вызовите doSomething (рекурсивную функцию), откуда вам нужна функция для запуска (помните, что вторая переменная - это число раз, которое вы хотите, чтобы она выполнялась, и 0 просто требуется каксчетчик)
doSomething(0, 3)
создать 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);
}
0 голосов
/ 08 февраля 2019

Обработчик просто планирует некоторую работу для последующего выполнения.Это на самом деле не блокирует текущий поток.Все, что вы делаете, - это планирование n1 элементов работы для выполнения через три секунды, которые будут выполняться последовательно с этой точной задержкой.

На самом деле вы никогда не захотите писать код для блокировки основногонить.Когда-либо.Это приведет к тому, что ваше приложение перестает отвечать на запросы.

...