Как задержать цикл в android без использования thread.sleep?

Я хотел задержать цикл for без использования Thread.sleep потому что этот метод заставляет все мое приложение зависать. Я пытался использовать handler но он не работает внутри цикла. Может кто-то укажет на ошибку в моем коде.

 public void onClick(View v) { if (v == start) { for (int a = 0; a<4 ;a++) { Handler handler1 = new Handler(); handler1.postDelayed(new Runnable() { ImageButton[] all= {btn1, btn2, btn3, btn4}; btn5 = all[random.nextInt(all.length)]; btn5.setBackgroundColor(Color.RED); @Override public void run() { } }, 1000); } } } 

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

Solutions Collecting From Web of "Как задержать цикл в android без использования thread.sleep?"

Ваш цикл for должен быть:

 final ImageButton[] all= {btn1, btn2, btn3, btn4}; Handler handler1 = new Handler(); for (int a = 1; a<=all.length ;a++) { handler1.postDelayed(new Runnable() { @Override public void run() { ImageButton btn5 = all[random.nextInt(all.length)]; btn5.setBackgroundColor(Color.RED); } }, 1000 * a); } } 

Таким образом, вы достигнете желаемого поведения по изменению цвета.

Отредактировано для синтаксиса

Вы можете использовать Handler вместо цикла. Вы не должны вызывать Thread.sleep() в потоке ui.

 Handler m_handler; Runnable m_handlerTask ; m_handler = new Handler(); m_handlerTask = new Runnable() { @Override public void run() { // do something m_handler.postDelayed(m_handlerTask, 1000); // 1 second delay } }; m_handlerTask.run(); 

Следующий код выполняет задачу за каждую секунду:

 final Handler handler = new Handler(); Runnable task = new Runnable() { @Override public void run() { Log.d(TAG, "Doing task"); handler.postDelayed(this, 1000); } }; handler.post(task); 

Попробуй это :

 public void onClick(View v) { if (v == start) { for (int a = 0; a<4 ;a++) { Handler handler1 = new Handler(); handler1.postDelayed(new Runnable() { ImageButton[] all= {btn1, btn2, btn3, btn4}; @Override public void run() { btn5 = all[random.nextInt(all.length)]; btn5.setBackgroundColor(Color.RED); } }, 1000); } } } 

Пример задержки:

 final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { // Do something after 5s = 5000ms buttons[inew][jnew].setBackgroundColor(Color.Red); } }, 5000);