【问题标题】:How to make a sleep thread in For loop?如何在 For 循环中创建睡眠线程?
【发布时间】:2014-03-14 19:29:14
【问题描述】:

我正在开发一款纸牌游戏应用程序,我完成了基本的东西,现在我正努力让它看起来很专业。 我首先要做的就是分配卡牌的效果, 我想做一个洗牌效果。 当一张牌发给玩家时,我希望与下一张将分发给他的牌有至少 500 毫秒的差异。 想法? 这是我的代码的一部分..

    private void SetTheGame() {
    SetShuffleSound();
    for ( int i = 0; i < Imagename.length;i++) {
        Imagename[i] = (ImageView) findViewById(WTF[i]);
        CountCards();
        Random = getRandom();
        SwitchImages SwitchMe = new SwitchImages(myNewArray[Random]);
        int first = SwitchMe.ChangeImages();
        Imagename[i].setImageResource(myNewArray[Random]);
        Imagename[i].setVisibility(View.VISIBLE);
        CardsCount valueOfCard = new CardsCount(myNewArray[Random]);
        int a = valueOfCard.WhatsMyValue();
        String b = valueOfCard.TheFamily();
        switch (i) {
        case 0:
            if (first != 0) {
                Imagename[0].setImageResource(first);
            }
            FirstColumnComputer.add(a);
            FirstColumnComputerFAMILY.add(b);

            break;
        case 1:
            if (first != 0) {
                Imagename[1].setImageResource(first);
            }
            SecondColumnComputer.add(a);
            SecondColumnComputerFAMILY.add(b);

            break;
        case 2:
            if (first != 0) {
                Imagename[2].setImageResource(first);
            }
            ThirdColumnComputer.add(a);
            ThirdColumnComputerFAMILY.add(b);


            break;
        case 3:
            if (first != 0) {
                Imagename[3].setImageResource(first);
            }
            FourColumnComputer.add(a);
            FourColumnComputerFAMILY.add(b);

            break;
        case 4:
            if (first != 0) {
                Imagename[4].setImageResource(first);
            }
            FifthColumnComputer.add(a);
            FifthColumnComputerFAMILY.add(b);

            break;
        case 5:
            FirstColumnPlayer.add(a);
            FirstColumnPlayerFAMILY.add(b);

            break;
        case 6:
            SecondColumnPlayer.add(a);
            SecondColumnPlayerFAMILY.add(b);

            break;
        case 7:
            ThirdColumnPlayer.add(a);
            ThirdColumnPlayerFAMILY.add(b);

            break;
        case 8:
            FourColumnPlayer.add(a);
            FourColumnPlayerFAMILY.add(b);

            break;
        case 9:
            FifthColumnPlayer.add(a);
            FifthColumnPlayerFAMILY.add(b);

            break;

        }
        Cards.remove(Random);
  //        MakeTheCardPause();
    }
    SentTheLinkedList();
}  

MakeTheCardPause() 是问题...

       private void MakeTheCardPause() {
      Thread Timer = new Thread()
    {
        public void run()
        {
            try{
                sleep(1000);
            }catch(InterruptedException e)
            {
            e.printStackTrace();
            }finally
            {
            //do something...   
            }

        }
    };  
    Timer.start();
}

谢谢!

【问题讨论】:

  • 您应该查看这个先前的 SO 问题,该问题继续解释如何以您尝试的方式正确使用睡眠。 stackoverflow.com/questions/14005549/…
  • 您不需要任何线程,只需使用 Handler 并发送延迟消息即可达到您想要的效果
  • 确实,在 Android 等事件驱动的系统上,睡眠并不是完成此任务的正确方法——相反,您应该使用各种机制之一来安排未来事件并处理下一张卡片在那个事件中。
  • @JoeBoyle - 这是一个通用的 Java 答案,适用于在控制台输出消息之间创建最短时间,但它不是特别适合 Android UI 编程的解决方案。
  • 你能创建一个 Runnable 然后在它上面调用 postDelayed() 并传递 500 毫秒吗?

标签: java android multithreading loops sleep


【解决方案1】:

您可以通过多种方式做到这一点。 Thread.sleep(500) 是您建议的方式,但这不是我推荐的方式。这里有两种选择

Message Handler

一个例子

Handler mHandler = new Handler(){           
            public void handleMessage(Message msg){
                super.handleMessage(msg);
                switch(msg.what){
                    case shuffle:
                        // Do something
                        break;
                    case doneShuffle:
                      //Do something
                }
            }       
        };

Asynch Tasks

这是一个例子:

private class shuffleCards extends AsyncTask<Card, Integer, Long> {
     protected Long doInBackground(Card card) {
         //Do something
            //shuffle deck
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return deck;
     }

     protected void onProgressUpdate(Integer... progress) {
         //Number of shuffled cards??
     }

     protected void onPostExecute(Long result) {
        //Show card
     }
 }

请记住,这只是显示结果的后台任务。您的主线程将处理实际的卡值并将它们交给异步任务。

祝你好运

【讨论】:

    【解决方案2】:

    这个呢?您需要在工作线程中休眠,您上面的代码正在创建一个新线程并告诉它休眠,这对用户没有明显的影响。

    private void SetTheGame() {
        SetShuffleSound();
        for ( int i = 0; i < Imagename.length;i++) {
            Imagename[i] = (ImageView) findViewById(WTF[i]);
            CountCards();
            Random = getRandom();
            SwitchImages SwitchMe = new SwitchImages(myNewArray[Random]);
            int first = SwitchMe.ChangeImages();
            Imagename[i].setImageResource(myNewArray[Random]);
            Imagename[i].setVisibility(View.VISIBLE);
            CardsCount valueOfCard = new CardsCount(myNewArray[Random]);
            int a = valueOfCard.WhatsMyValue();
            String b = valueOfCard.TheFamily();
            switch (i) {
            case 0:
                if (first != 0) {
                    Imagename[0].setImageResource(first);
                }
                FirstColumnComputer.add(a);
                FirstColumnComputerFAMILY.add(b);
    
                break;
            case 1:
                if (first != 0) {
                    Imagename[1].setImageResource(first);
                }
                SecondColumnComputer.add(a);
                SecondColumnComputerFAMILY.add(b);
    
                break;
            case 2:
                if (first != 0) {
                    Imagename[2].setImageResource(first);
                }
                ThirdColumnComputer.add(a);
                ThirdColumnComputerFAMILY.add(b);
    
    
                break;
            case 3:
                if (first != 0) {
                    Imagename[3].setImageResource(first);
                }
                FourColumnComputer.add(a);
                FourColumnComputerFAMILY.add(b);
    
                break;
            case 4:
                if (first != 0) {
                    Imagename[4].setImageResource(first);
                }
                FifthColumnComputer.add(a);
                FifthColumnComputerFAMILY.add(b);
    
                break;
            case 5:
                FirstColumnPlayer.add(a);
                FirstColumnPlayerFAMILY.add(b);
    
                break;
            case 6:
                SecondColumnPlayer.add(a);
                SecondColumnPlayerFAMILY.add(b);
    
                break;
            case 7:
                ThirdColumnPlayer.add(a);
                ThirdColumnPlayerFAMILY.add(b);
    
                break;
            case 8:
                FourColumnPlayer.add(a);
                FourColumnPlayerFAMILY.add(b);
    
                break;
            case 9:
                FifthColumnPlayer.add(a);
                FifthColumnPlayerFAMILY.add(b);
    
                break;
    
            }
            Cards.remove(Random);
            long sleepMax = 1000L;
            Random r = new Random();
            long delay = (long) (r.nextDouble() * range);
            Thread.sleep(delay);
        }
        SentTheLinkedList();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      相关资源
      最近更新 更多