Ваша проблема в том, что ваш цикл создает сразу несколько обработчиков, которые задерживаются на 3 секунды, а затем показывают тост.Они не ждут друг друга, и поскольку они создаются за миллисекунды друг от друга, они будут показывать тост одновременно.
Я не уверен, чего вы пытаетесь достичь, и циклвероятно не то, что вы хотите.Однако это способ отображения тоста через 3 секунды, а затем через каждые 3 секунды несколько раз.
Для этого мы будем использовать рекурсию, потому что она сделает так, чтобы вы не блокировались наосновной поток.
- Вызовите 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);
}