I think the easiest and most stable and the most useful way as of 2020 is using delay
function of Coroutines instead of Runnable. Coroutines is a good concept to handle asynchronous jobs and its delay
component will be this answer's focus.
WARNING: Coroutines need Kotlin language and I didn't convert the codes to Kotlin but I think everybody can understand the main concept..
Just add the Coroutines on your build.gradle
:
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
Add a job to your class (activity, fragment or something) which you will use coroutines in it:
private var job: Job = Job()
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
And you can use Coroutines anywhere on the class by using launch{ } body. So you can write your code like this:
public void onClick(View v) {
launch {
switch(v.getId()) {
case R . id . rollDice :
Random ranNum = new Random();
int number = ranNum . nextInt (6) + 1;
diceNum.setText("" + number);
sum = sum + number;
for (i= 0;i < 8;i++){
for (j= 0;j < 8;j++){
int value =(Integer) buttons [i][j].getTag();
if (value == sum) {
inew = i;
jnew = j;
buttons[inew][jnew].setBackgroundColor(Color.BLACK);
delay(2000)
buttons[inew][jnew].setBackgroundColor(Color.WHITE);
break;
}
}
}
break;
}
}
}
It's All...
Dont't forget that launch{}
function is asynchronous and the for loop will not wait for delay
function to finish if you write like this:
launch{
buttons[inew][jnew].setBackgroundColor(Color.BLACK);
delay(2000)
buttons[inew][jnew].setBackgroundColor(Color.WHITE);
}
So, launch{ }
should cover the for loop if you want all the for loop to wait for delay
.
Another benefit of launch{ }
is that you are making the for loop asynchronous, which means it is not gonna block the main UI thread of the application on heavy processes.