Thread.sleep
を使用せずにforループを遅延させたかったのは、その方法によりアプリケーション全体がハングアップするためです。 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
ターンを示すことなく、直接赤に変わるわけではありません。
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);
}
}
このようにして、色の変化をずらすという目的の動作を実現します。
構文の編集
Forループの代わりにHandler
を使用できます。 UIスレッドでThread.sleep()
を呼び出さないでください。
final Handler handler = new Handler();
final Runnable runnable = new Runnable() {
@Override
public void run() {
// do something
handler.postDelayed(runnable, 1000L); // 1 second delay
}
};
runnable.run();
1秒ごとにタスクを実行する次のコード:
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);