Как установить задержку в 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;
}
}
Я хочу установить задержку между командой между изменением фона. Я пробовал использовать таймер потока и попытался с помощью бегать и ловить. Но это не работает. Я пробовал это
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);
но он только меняется на черный.
7 ответов:
попробуйте этот код:
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);
можно использовать
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();
Если вы часто используете delay в своем приложении, используйте этот класс утилиты
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 } });
Если вы хотите сделать что-то в пользовательском интерфейсе на регулярных интервалах времени очень хороший вариант-использовать CountDownTimer:
new CountDownTimer(30000, 1000) { public void onTick(long millisUntilFinished) { mTextField.setText("seconds remaining: " + millisUntilFinished / 1000); } public void onFinish() { mTextField.setText("done!"); } }.start();
вы можете использовать это:
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" представляет миллисекунды , например установите delay на 5000-для задержки 5 секунд
обработчик ответ в Котлин:
1 - Создать топ-уровня функции внутри файла (например, файла, который содержит все ваши функции верхнего уровня):
fun delayFunction(function: ()-> Unit, delay: Long) { Handler().postDelayed(function, delay) }2-тогда назовите его в любом месте вам это нужно:
delayFunction({ myDelayedFunction() }, 300)
Comments