2013-04-08 14 views
105
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; 

     } 
    } 

Desidero impostare un ritardo tra il comando tra la modifica dello sfondo. Ho provato a usare un timer di thread e ho provato a usare run e catch. Ma non sta funzionando. Ho provato questoCome impostare il ritardo in Android?

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

Ma si sta cambiando solo in nero.

risposta

336

provare questo codice:

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

Molto meglio di Thread.sleep(). –

+0

Ha funzionato. Grazie –

+0

Questa soluzione ha spiegato tutte le domande che ho avuto con i gestori di alcune linee di codice. – Sierisimo

12

Utilizzando il metodo Thread.sleep(millis).

+16

non eseguire questa operazione sul thread dell'interfaccia utente: altri elementi potrebbero inoltre non rispondere e in seguito comportarsi in modo imprevedibile – jmaculate

+0

grazie per l'avviso. questo è esattamente quello di cui ho bisogno, per ritardare il thread dell'interfaccia utente. risposta perfetta per i miei bisogni. Grazie. – hamish

28

È possibile utilizzare CountDownTimer che è molto più efficiente di qualsiasi altra soluzione pubblicata. È anche possibile produrre notifiche regolari intervalli lungo la strada utilizzando il suo metodo onTick(long)

Date un'occhiata a questo esempio che mostra un 30 secondi del conto alla rovescia

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

Quindi dovresti cancellare il timer ad un certo punto – peter

1

Se si vuole fare qualcosa nell'interfaccia utente su intervalli di tempo regolari molto buona opzione è quella di utilizzare CountDownTimer:

new CountDownTimer(30000, 1000) { 

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

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

Se si utilizza ritardo frequentemente nella vostra applicazione, utilizzare questa classe di utilità

import android.os.Handler; 

/** 
* Author : Rajanikant 
* Date : 16 Jan 2016 
* Time : 13:08 
*/ 
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. 
    } 
} 

Usage:

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

    } 
}); 
+0

questo è quello che stavo cercando .. – Qasim

Problemi correlati