Как установить задержку в Android?
public void onClick(View v) {
// TODO Auto-generated method stub
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);
//I want to insert a delay here
buttons[inew][jnew].setBackgroundColor(Color.WHITE);
break;
}
}
}
break;
}
}
Я хочу установить задержку между командой между сменой фона. Я попытался использовать таймер потока и попытался использовать run и catch. Но он не работает. Я попробовал это
Thread timer = new Thread() {
public void run(){
try {
buttons[inew][jnew].setBackgroundColor(Color.BLACK);
sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
timer.start();
buttons[inew][jnew].setBackgroundColor(Color.WHITE);
Но он только меняется на черный.
Ответы
Ответ 1
Попробуйте этот код:
import android.os.Handler;
...
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// Do something after 5s = 5000ms
buttons[inew][jnew].setBackgroundColor(Color.BLACK);
}
}, 5000);
Ответ 2
Вы можете использовать CountDownTimer
, который намного эффективнее любого другого опубликованного решения. Вы также можете производить регулярные уведомления по интервалам, используя метод onTick(long)
Посмотрите на этот пример, показывающий обратный отсчет 30 секунд
new CountDownTimer(30000, 1000) {
public void onFinish() {
// When timer is finished
// Execute your code here
}
public void onTick(long millisUntilFinished) {
// millisUntilFinished The amount of time until finished.
}
}.start();
Ответ 3
Если вы часто используете задержку в своем приложении, используйте этот класс утилит
import android.os.Handler;
public class Utils {
// Delay mechanism
public interface DelayCallback{
void afterDelay();
}
public static void delay(int secs, final DelayCallback delayCallback){
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
delayCallback.afterDelay();
}
}, secs * 1000); // afterDelay will be executed after (secs*1000) milliseconds.
}
}
Использование:
// Call this method directly from java file
int secs = 2; // Delay in seconds
Utils.delay(secs, new Utils.DelayCallback() {
@Override
public void afterDelay() {
// Do something after delay
}
});
Ответ 4
Использование метода Thread.sleep(millis
).
Ответ 5
Если вы хотите что-то сделать в пользовательском интерфейсе с регулярными временными интервалами, очень хороший вариант - использовать CountDownTimer:
new CountDownTimer(30000, 1000) {
public void onTick(long millisUntilFinished) {
mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
mTextField.setText("done!");
}
}.start();
Ответ 6
Вы можете использовать это:
import java.util.Timer;
и для самой задержки добавьте:
new Timer().schedule(
new TimerTask(){
@Override
public void run(){
//if you need some code to run when the delay expires
}
}, delay);
переменная "delay" представляет миллисекунды, например, установите задержку на 5000 - для задержки 5 секунд
Ответ 7
Ответ обработчика в Котлине:
1. Создайте функцию верхнего уровня внутри файла (например, файла, который содержит все ваши функции верхнего уровня):
fun delayFunction(function: ()-> Unit, delay: Long) {
Handler().postDelayed(function, delay)
}
2 - Затем позвоните туда, где вам нужно:
delayFunction({ myDelayedFunction() }, 300)
Ответ 8
Вот пример, где я меняю фоновое изображение с одного на другое с 2-секундной задержкой альфа-замирания в обе стороны - 2-секундное затухание исходного изображения в 2-секундное затухание во 2-е изображение.
public void fadeImageFunction(View view) {
backgroundImage = (ImageView) findViewById(R.id.imageViewBackground);
backgroundImage.animate().alpha(0f).setDuration(2000);
// A new thread with a 2-second delay before changing the background image
new Timer().schedule(
new TimerTask(){
@Override
public void run(){
// you cannot touch the UI from another thread. This thread now calls a function on the main thread
changeBackgroundImage();
}
}, 2000);
}
// this function runs on the main ui thread
private void changeBackgroundImage(){
runOnUiThread(new Runnable() {
@Override
public void run() {
backgroundImage = (ImageView) findViewById(R.id.imageViewBackground);
backgroundImage.setImageResource(R.drawable.supes);
backgroundImage.animate().alpha(1f).setDuration(2000);
}
});
}
Ответ 9
Вместо этого вы можете использовать Thread.sleep(millis)
только sleep(millis)
и импортировать класс потока.