Android'de gecikme nasıl ayarlanır?


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

        }
    }

Arka plan değiştirme arasındaki komut arasında bir gecikme ayarlamak istiyorum. Bir iş parçacığı zamanlayıcı kullanmayı denedim ve run ve catch kullanarak çalıştı. Ama işe yaramıyor. Bunu denedim

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

Ama sadece siyaha dönüşüyor.

Yanıtlar:


500

Bu kodu deneyin:

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

1
Bu çözüm, bazı kod satırlarında işleyicilerle ilgili tüm soruları açıkladı.
Sierisimo

45
Her zaman bu yazıya geri geliyorum çünkü her seferinde yazmak için çok tembelim. Teşekkür ederim.
Eugene H

iyi llok güzel ama beklemek sonra göstermek için mesaj bir sürü var. bu yüzden çok yönlü basamaklar sorun yaratır. çoklu basamaklar problemini nasıl çözebilirim
mehmet

2
Bu çözüm, dış sınıfına, etkinliğine dolaylı olarak başvuruda bulunan statik olmayan bir iç ve anonim sınıf kullandığından bir bellek sızıntısı üretir. Daha iyi bir çözüm için stackoverflow.com/questions/1520887/… adresine bakın .
tronman

@EugeneH Daha kolay yaşam için Canlı Şablonları kullanın stackoverflow.com/a/16870791/4565796
Saeed Arianmanesh

38

CountDownTimerYayınlanan diğer çözümlerden çok daha verimli olanı kullanabilirsiniz . onTick(long)Yöntemini kullanarak yol boyunca aralıklarla düzenli bildirimler de üretebilirsiniz.

30 saniyelik geri sayım gösteren bu örneğe bir göz atın

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

23

Uygulamanızda sık sık gecikme kullanıyorsanız, bu yardımcı program sınıfını kullanın

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

Kullanımı:

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

    }
});

1
Neden ? Bu saf havai ve karmaşıklık ... hiçbir şey için
juloo65

Sık sık gecikmeler kullanırsak, gecikmeler için sabit bir biçime sahip olmak iyidir. Bir ek arabirim ve bir yöntem nedeniyle çok fazla yük olduğunu sanmıyorum.
aruke

18

Thread.sleep(millis)Yöntemi kullanarak .


30
bunu UI iş parçacığında yapmayın - diğer öğeler de yanıt vermeyebilir ve daha sonra beklenmedik şekilde davranabilir
23'te jmaculate

1
uyarı için teşekkürler. Bu tam olarak ihtiyacım olan şey, UI iş parçacığını geciktirmek için. ihtiyaçlarım için mükemmel cevap. Teşekkürler.
hamish

7

Kullanıcı arayüzünde düzenli zaman aralıklarında bir şeyler yapmak istiyorsanız CountDownTimer'ı kullanmak çok iyi bir seçenek:

new CountDownTimer(30000, 1000) {

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

     public void onFinish() {
         mTextField.setText("done!");
     }
  }.start();

İşleyiciden daha temiz .
Ahsan

3

Kotlin'de işleyici cevabı:

1 - Bir dosyanın içinde bir üst düzey işlev oluşturun (örneğin, tüm üst düzey işlevlerinizi içeren bir dosya):

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

2 - O zaman ihtiyacınız olan her yerde arayın:

delayFunction({ myDelayedFunction() }, 300)

2

Bunu kullanabilirsiniz:

import java.util.Timer;

ve gecikmenin kendisi için şunu ekleyin:

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

burada delaydeğişken milisaniye cinsindendir; örneğin delay5 saniyelik bir gecikme için 5000'e ayarlayın .


0

Burada, her iki şekilde 2 saniyelik bir alfa solma gecikmesi ile arka plan görüntüsünü birinden diğerine değiştirdiğim bir örnek var - orijinal görüntünün 2s solması, 2. görüntüye 2s solmaya.

    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);
        }
    });
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.