2016-07-22 6 views
2

遅延機能のハンドラーを実装する際に問題があります。これは簡単なダイスゲームであるはずです。アンドロイドハンドラーの待機/スリープが機能しない

コンピュータがサイコロを振っているとき、各ロールの間に休止があるので、ユーザーはコンピュータのロールを見ることができます。コードを実行すると、2秒間待ってから再度ローリングする必要があります。これは起こりません。

これは私の最初の投稿です。どんな提案も大歓迎です。

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秒間実行を延期して、 'if(compTurnScore <20)// cpuが20未満のロールを残す場合// computerTurn();' timerHandler.postDelayed(timerRunnable、2000);を呼び出します。 –

答えて

0

私はそれはあなたがサイコロローリングが発生した場合、別の(compTurnScore < 20の条件)と呼ばれる必要があるcomputerTurn()場合にのみdealyで示されるべきであること、その実行にcomputerTurn()を望ん修正につれ。

Handlerを使用する場合は、「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コンテキストはもう存在しない場合があります一度に呼び出すことができることに注意してください:コードは、(元のコードに基づいて)このようなものになるだろう。 ActivityまたはFragmentが安全であるかどうかを確認する方法については、他の記事に従ってください。

+0

ありがとう答え。それは私が望むのとまったく同じように働いた – ImTheRealOne

関連する問題