2015-06-11 23 views
0

我試圖使用Thread.sleep(),但它沒有奏效。當我使用它時,應用程序停止響應。如何以編程方式導致Android延遲?

我需要把一些延誤在我的代碼是這樣的:

public void inicioJogo(){ 
     for (int jogada = 1; jogada <= 50; jogada++) { 
      for (int contador = 0; contador < jogada; contador++){ 
       // HERE - Wait 1 sec before go to next line. 
       btPedra[sequencia[contador]].setBackgroundResource(imagensHover[sequencia[contador]]); 
       // HERE - Wait 1 sec before go to next line. 
       btPedra[sequencia[contador]].setBackgroundResource(imagensNormal[sequencia[contador]]); 
       // Now continue looping. 
      } 
     } 
} 

我試圖用處理器,這樣的:等待前

private Handler handler = new Handler(); 
    for (int jogada = 1; jogada <= 50; jogada++) { 
     for (int contador = 0; contador < jogada; contador++){ 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        btPedra[sequencia[contador]].setBackgroundResource(imagensHover[sequencia[contador]]); 
       } 
      }, 1000); 
     } 
    } 

但是當我使用它時,循環繼續1秒。我需要一個延遲,可以停止循環1秒,轉到下一行,然後繼續循環。

+1

看看這個帖子它會幫助你 http://stackoverflow.com/questions/6704020/give-a-delay-of-few-seconds-without-using-threads] –

回答

0

爲什麼它不迴應是因爲你調用sleep在當前線程上的原因延遲之後執行。而你正在處理的當前線程是UI線程。所以基本上你會嘗試改變背景,然後讓線程進入睡眠狀態,直到睡眠完成後才阻止它被改變。

您需要在另一個線程運行循環和睡在那裏,因此不會影響主線程:前

final Handler handler = new Handler(); 
new Thread(new Runnable() { 
    @Override 
    public void run() { 
     for (int jogada = 1; jogada <= 50; jogada++) { 
      for (int contador = 0; contador < jogada; contador++){ 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       handler.post(new Runnable() { 
        @Override 
        public void run() { 
         btPedra[sequencia[contador]].setBackgroundResource(imagensHover[sequencia[contador]]); 
        } 
       }); 
      } 
     } 
    } 
}).start(); 

注意,背景變化是通過創建處理程序完成啓動新線程。該處理程序是在當前線程(即UI線程)上創建的,並且發佈給它的每條消息都將在該線程上運行。

所以基本上你循環和等待另一個線程,但在UI線程上做後臺更改。

+0

哦tyvm傢伙!有用!我從昨天開始試圖找到解決方案,非常感謝! –

+0

@MichaelMarcel我的榮幸:) – Simas

1

您可以使用ScheduledExecutorService

ScheduledExecutorService scheduledExecutorService = 
    Executors.newScheduledThreadPool(NO_OF_THREADS); 

ScheduledFuture scheduledFuture = 
    scheduledExecutorService.schedule(task, NO_OF_SECONDS_TO_WAIT, TimeUnit.SECONDS); 

現在的「任務」的NO_OF_SECONDS_TO_WAIT