Bagaimana cara mengatur penundaan di android?

164
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;

        }
    }

Saya ingin mengatur penundaan antara perintah antara mengubah latar belakang. Saya mencoba menggunakan timer thread dan mencoba menggunakan lari dan tangkap. Tapi itu tidak berhasil. Saya mencoba ini

 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);

Tapi itu hanya berubah menjadi hitam.

Kenneth Joseph Paul
sumber

Jawaban:

499

Coba kode ini:

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);
Tuan Vu
sumber
1
Solusi ini menjelaskan semua pertanyaan yang saya miliki dengan penangan di beberapa baris kode.
Sierisimo
45
Saya selalu kembali ke posting ini karena saya terlalu malas untuk menulisnya setiap waktu. Terima kasih.
Eugene H
baik itu llok bagus tetapi saya punya banyak pesan untuk menunggu kemudian tunjukkan. jadi multible tapak memberi masalah. bagaimana bisa memecahkan banyak masalah tapak
mehmet
2
Solusi ini menghasilkan kebocoran memori karena menggunakan kelas non-statis dalam dan anonim yang secara implisit memegang referensi ke kelas luarnya, aktivitas. Lihat stackoverflow.com/questions/1520887/… untuk solusi yang lebih baik.
tronman
@EugeneH Gunakan Template Langsung untuk kehidupan yang lebih mudah stackoverflow.com/a/16870791/4565796
Saeed Arianmanesh
38

Anda dapat menggunakan CountDownTimermana yang jauh lebih efisien daripada solusi lain yang diposting. Anda juga dapat menghasilkan notifikasi reguler pada interval di sepanjang jalan menggunakan onTick(long)metodenya

Lihat contoh ini yang menunjukkan hitungan mundur 30 detik

   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();
Sufiyan Ghori
sumber
23

Jika Anda sering menggunakan penundaan di aplikasi, gunakan kelas utilitas ini

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.
    }
}

Pemakaian:

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

    }
});
aruke
sumber
1
Mengapa Ini murni overhead dan kompleksitas ... gratis
juloo65
Jika kita sering menggunakan penundaan, maka format tetap untuk penundaan tidak masalah. Saya tidak berpikir ada banyak overhead karena satu antarmuka tambahan dan metode.
aruke
18

Menggunakan Thread.sleep(millis)metode.

pengguna2270457
sumber
30
jangan lakukan ini pada utas UI - elemen lain juga dapat berhenti merespons dan kemudian berperilaku tak terduga
jmaculate
1
Terima kasih atas peringatannya. itulah yang saya butuhkan, untuk menunda utas UI. jawaban sempurna untuk kebutuhan saya. Terima kasih.
hamish
7

Jika Anda ingin melakukan sesuatu di UI pada interval waktu reguler, pilihan yang sangat baik adalah menggunakan CountDownTimer:

new CountDownTimer(30000, 1000) {

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

     public void onFinish() {
         mTextField.setText("done!");
     }
  }.start();
Ivo Stoyanov
sumber
Ini lebih bersih daripada Handler .
Ahsan
3

Jawaban Handler di Kotlin:

1 - Buat fungsi tingkat atas di dalam file (misalnya file yang berisi semua fungsi tingkat atas Anda):

fun delayFunction(function: ()-> Unit, delay: Long) {
    Handler().postDelayed(function, delay)
}

2 - Lalu sebut di mana saja Anda membutuhkannya:

delayFunction({ myDelayedFunction() }, 300)
Phil
sumber
2

Anda bisa menggunakan ini:

import java.util.Timer;

dan untuk penundaan itu sendiri, tambahkan:

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

di mana delayvariabel dalam milidetik; misalnya diatur delayke 5000 untuk penundaan 5 detik.

Dror
sumber
0

Berikut adalah contoh di mana saya mengubah gambar latar belakang dari satu ke yang lain dengan penundaan fade alpha 2 detik dua arah - 2s fadeout dari gambar asli menjadi 2s fadein menjadi gambar ke-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);
        }
    });
}
MuharizJ
sumber