Android: как создать задержку в цикле при обновлении интерфейса - PullRequest
1 голос
/ 13 мая 2011

Это мой первый пост, извините, если я не правильно отформатировал свой вопрос.Я разрабатываю свое первое приложение для Android, и это карточная игра.Я разработал ту же карточную игру на C # с использованием Visual Studio.В C # для имитации действия и задержки при работе и т. Д. Я спал с потоком в течение заданного промежутка времени, а затем вызвал метод Application.DoEvents (), который вынудил пользовательский интерфейс обновить.Тем не менее, в Java, я не могу найти ответ на эту проблему.

Я опубликую некоторый код из моего метода deal (), который мне нужно отложить, чтобы было похоже, что карты фактически раздаются по кругу, и не все сразу, поскольку компьютер работает так быстро:

private void dealHelper () {Hand pCards = Referee.getHumanHand ();

    //show all cards in rotating order
    for(int i=0; i<CARD_COUNT; i++)
    {
        ///////////////////////////////////////////////////////////////////////
        // load each card into their appropriate ImageViews and make visible //
        ///////////////////////////////////////////////////////////////////////

        //human player
        LoadCard(playerCards.get(i), pCards.getCard(i));
        playerCards.get(i).setVisibility(View.VISIBLE);
        playerCards.get(i).setPadding(1, 1, 1, 1);

        // allow discarded cards to be clickable
        discardCardImages.get(i).setPadding(1, 1, 1, 1);

        //computer 1
        computer1Cards.get(i).setImageResource(R.drawable.cardskin);
        computer1Cards.get(i).setVisibility(View.VISIBLE);

        //computer 2
        computer2Cards.get(i).setImageResource(R.drawable.cardskin);
        computer2Cards.get(i).setVisibility(View.VISIBLE);

        //computer 3
        computer3Cards.get(i).setImageResource(R.drawable.cardskin);
        computer3Cards.get(i).setVisibility(View.VISIBLE);
    }
}

Мне нужна небольшая задержка около 500 мс между каждой картой, которая отображается на экране, чтобы симулировать действие,Я искал и искал, и у меня нет решения, которое работает (или я понимаю).Любая помощь приветствуется.

Спасибо, Даниэль

Ответы [ 4 ]

8 голосов
/ 13 мая 2011

Используйте обработчик с Runnable (который выполняет одну итерацию цикла в его run ()) и postDelayed(Runnable r, long delayMillis) для задержки.Подсчитайте итерации, чтобы вы знали, когда нужно остановиться и использовать последнюю для removeCallbacks() и вызвать метод для выполнения того, что должно быть после завершения обработки.


Что-то вроде

private final Handler mHandler = new Handler();
private int iLoopCount = 0;

private final Runnable rDealAndWait = new Runnable()
{
  public void run()
  {
    if (dealtAHand())
    {
      ++iLoopCount;
      mHandler.postAtTime(this, SystemClock.uptimeMillis() + DEAL_DELAY);
    }
    else
    {
      doAfterAllHandsDealt();
    }
  }
};


private boolean dealtAHand()
{
  if (i == CARD_COUNT) return false;

  //human player
  LoadCard(playerCards.get(iLoopCount), pCards.getCard(i));
  playerCards.get(iLoopCount).setVisibility(View.VISIBLE);
  playerCards.get(iLoopCount).setPadding(1, 1, 1, 1);

  // etc

  return true;
}

А потом в onCreate или куда угодно

  dealtAHand();
  mHandler.postAtTime(rDealAndWait, SystemClock.uptimeMillis() + DEAL_DELAY);

}

0 голосов
/ 08 марта 2013

пожалуйста, проверьте мой ответ здесь это может помочь вам.Не знаю, как это правильно, но у меня все получилось очень хорошо.

                @Override
                public void run() {
                    for(int i = 0;i<diceNum;i++){
                        runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                            //do your Ui task here
                            }
                        });

                        try {

                            Thread.sleep(500);

                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
              }
            } 
0 голосов
/ 13 мая 2011

Если у вас ничего не вышло из вышеперечисленных решений, попробуйте CountDownTimer здесь,

http://developer.android.com/reference/android/os/CountDownTimer.html

0 голосов
/ 13 мая 2011

Попробуйте Thread.sleep(long millis). Вам придется поместить его в блок try / catch.

...