如何在android中设置延迟?

Ken*_*aul 154 java 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 Code Online (Sandbox Code Playgroud)

我想在更改背景之间设置命令之间的延迟.我尝试使用线程计时器并尝试使用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);
Run Code Online (Sandbox Code Playgroud)

但它只会变成黑色.

Tua*_* Vu 460

试试这段代码:

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);
Run Code Online (Sandbox Code Playgroud)

  • 我总是回到这篇文章,因为我每次都懒得写它.谢谢. (28认同)
  • 此解决方案产生内存泄漏,因为它使用非静态内部和匿名类,它隐式保存对其外部类(活动)的引用.有关更好的解决方案,请参阅/sf/ask/106462121/#3039718. (2认同)

Suf*_*ori 33

您可以使用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();
Run Code Online (Sandbox Code Playgroud)


aru*_*uke 22

如果您经常在应用中使用延迟,请使用此实用程序类

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.
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

// 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

    }
});
Run Code Online (Sandbox Code Playgroud)

  • 为什么 ?这是纯粹的开销和复杂性......毫无意义 (2认同)

小智 16

使用Thread.sleep(millis))方法.

  • 不要在UI线程上执行此操作 - 其他元素也可能会停止响应,以后会出现不可预测的行为 (23认同)

Ivo*_*nov 6

如果您想按固定的时间间隔在UI中执行某项操作,非常好的选择是使用CountDownTimer:

new CountDownTimer(30000, 1000) {

     public void onTick(long millisUntilFinished) {
         mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
     }

     public void onFinish() {
         mTextField.setText("done!");
     }
  }.start();
Run Code Online (Sandbox Code Playgroud)


Dro*_*ror 6

你可以使用这个:

import java.util.Timer;
Run Code Online (Sandbox Code Playgroud)

对于延迟本身,添加:

 new Timer().schedule(
                    new TimerTask(){
                
                        @Override
                        public void run(){
                            
                        //if you need some code to run when the delay expires
                        }
                        
                    }, delay);
Run Code Online (Sandbox Code Playgroud)

其中delay变量以毫秒为单位;例如,设置delay为 5000 表示 5 秒延迟。


Phi*_*hil 5

Kotlin 中的处理程序答案:

1 - 在文件内创建一个顶级函数(例如包含所有顶级函数的文件):

fun delayFunction(function: ()-> Unit, delay: Long) {
    Handler().postDelayed(function, delay)
}
Run Code Online (Sandbox Code Playgroud)

2 - 然后在您需要的任何地方调用它:

delayFunction({ myDelayedFunction() }, 300)
Run Code Online (Sandbox Code Playgroud)