如何在不使用thread.sleep的情况下延迟android中的循环?

我想延迟一个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 "如何在不使用thread.sleep的情况下延迟android中的循环?"

您的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而不是for循环。 你不应该在这个线程上调用Thread.sleep()

 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);