Как установить задержку в 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);


но он только меняется на черный.

1676   7  

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

    }
});

С помощью Thread.sleep(millis) метод.

Если вы хотите сделать что-то в пользовательском интерфейсе на регулярных интервалах времени очень хороший вариант-использовать 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

    Ничего не найдено.