2016-07-22 54 views
2

我在執行延遲函數的處理程序時遇到問題。這應該是一個簡單的骰子游戲。安卓處理程序等待/睡眠不起作用

當輪到電腦轉動骰子時,應該在每個骰子之間停頓一下,這樣用戶就可以看到電腦滾動了。當我運行代碼時,它應該等待2秒鐘再次滾動。這不會發生。

這是我在stackoverflow上的第一篇文章。歡迎任何建議。

Handler timerHandler = new Handler(); 
Runnable timerRunnable = new Runnable() { 
    @Override 
    public void run() { 
    timerHandler.postDelayed(this, 2000); //delay run for 2 seconds 
    } 
}; 

public void computerTurn() { 
    rollButton.setEnabled(false); //disable UI for cpu's turn 
    holdButton.setEnabled(false); 
    ImageView diceImg = (ImageView) findViewById(R.id.dicePic); 
    Random r = new Random(); 

    diceRoll = r.nextInt(6) + 1; 
    switch (diceRoll) { 
    case 1: 
     compTurnScore = 0; 
     diceImg.setImageResource(R.drawable.dice1); 
     compTurnScoreTxt.setText("Computer Turn Total :" + compTurnScore); 
     break; 
    case 2: ... 
    case 3: ... 
    case 4: ... 
    case 5: ... 
    case 6: 
     compTurnScore += 6; 
     diceImg.setImageResource(R.drawable.dice6); 
     compTurnScoreTxt.setText("Computer Turn Total :" + compTurnScore); 
     break; 
    } 

    timerHandler.postDelayed(timerRunnable, 0); //run the timerhandler without any delay 
    if(compTurnScore < 20) //if cpu rolls less than 20 keep rolling 
    computerTurn(); 
} 
+0

嘗試'Thread.sleep(2000)' –

+0

在'timerRunnable'裏面,移除'timerHandler.postDelayed(this,2000); //延遲運行2秒鐘'並且如果(compTurnScore <20)//如果cpu滾動小於20則繼續滾動 computerTurn();'並調用'timerHandler.postDelayed(timerRunnable,2000);' –

回答

0

當我得到它糾正你想computerTurn()來執行的話,如果骰子滾動情況應該與迪利顯示只有在被稱爲另一個computerTurn()需求(的compTurnScore < 20條件)。

如果你想使用Handler s我建議把它看作是「讓我們從Handler延遲呼叫computerTurn()」。代碼會是這樣的(根據你原來的代碼):

Handler timerHandler = new Handler(); // Created in Main thread thus handled in Main thread 
Runnable timerRunnable = new Runnable() { 
    @Override 
    public void run() { 
    computerTurn(); // Called in Main thread 
    } 
}; 

public void computerTurn() { 
    rollButton.setEnabled(false); //disable UI for cpu's turn 
    holdButton.setEnabled(false); 
    ImageView diceImg = (ImageView) findViewById(R.id.dicePic); 
    Random r = new Random(); 

    diceRoll = r.nextInt(6) + 1; 
    switch (diceRoll) { 
    case 1: 
     compTurnScore = 0; 
     diceImg.setImageResource(R.drawable.dice1); 
     compTurnScoreTxt.setText("Computer Turn Total :" + compTurnScore); 
     break; 
    case 2: ... 
    case 3: ... 
    case 4: ... 
    case 5: ... 
    case 6: 
     compTurnScore += 6; 
     diceImg.setImageResource(R.drawable.dice6); 
     compTurnScoreTxt.setText("Computer Turn Total :" + compTurnScore); 
     break; 
    } 

    if(compTurnScore < 20) { //if cpu rolls less than 20 keep rolling 
    timerHandler.postDelayed(timerRunnable, 2000); //request another round of computerTurn() to be called after 2 sec 
    } 
} 

請注意,一些泄漏可能是爲了這裏computerTurn()可以在當ActivityFragment方面可能不存在了的時候被調用。請關注其他帖子,瞭解如何檢查ActivityFragment是否仍處於狀態,以便您可以安全地訪問其視圖。

+0

謝謝答案。這完全符合我的想法。 – ImTheRealOne