安卓:如何在更新UI的同时创建循环延迟



这是我在这里的第一篇文章,如果我的问题格式不正确,很抱歉。我正在开发我的第一个Android应用程序,它是一个纸牌游戏。我使用Visual Studio在C#中开发了相同的纸牌游戏。在 C# 中,为了模拟处理时的动作和延迟等,我将线程休眠了给定的时间,然后调用了强制 UI 更新的方法 Application.DoEvents()。但是,在java中,我似乎找不到这个问题的答案。

我将从我的 deal() 方法中发布一些代码,我需要延迟这些代码,以便看起来这些牌实际上是在一个圆圈中发牌的,而不是一次全部发牌,因为计算机运行得如此之快:

private void dealHelper() { 手牌 = 裁判.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 毫秒的轻微延迟来模拟动作。我已经搜索了又搜索,但没有有效的解决方案(或者我理解)。任何帮助将不胜感激。

谢谢丹尼尔

使用带有 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;
}

然后在创建或任何地方

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

}

试试Thread.sleep(long millis) . 你必须把它放在一个尝试/捕获块中。

如果上述解决方案对您没有任何帮助,请尝试在此处使用CountDownTimer,

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

请在这里查看我的答案,它可能会对您有所帮助。 不知道它的正确方式,但它对我很好。

                @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();
                        }
              }
            } 

相关内容

  • 没有找到相关文章

最新更新