Java 如何在For循环中创建睡眠线程?
我正在开发一款纸牌游戏应用程序,我完成了基本的工作,现在我正努力让它看起来更专业。 我想做的第一件事是分发卡片的效果, 我想制作一张洗牌牌效果。 当一张牌给一个玩家时,我希望下一张牌至少有500毫秒的时间差。 思想? 这是我代码中的一部分Java 如何在For循环中创建睡眠线程?,java,android,multithreading,loops,sleep,Java,Android,Multithreading,Loops,Sleep,我正在开发一款纸牌游戏应用程序,我完成了基本的工作,现在我正努力让它看起来更专业。 我想做的第一件事是分发卡片的效果, 我想制作一张洗牌牌效果。 当一张牌给一个玩家时,我希望下一张牌至少有500毫秒的时间差。 思想? 这是我代码中的一部分 private void SetTheGame() { SetShuffleSound(); for ( int i = 0; i < Imagename.length;i++) { Imagename[i] =
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();
}
谢谢 这个怎么样?您需要在工作线程中进行睡眠,上面的代码正在创建一个新线程并告诉它睡眠,这对用户没有明显的影响
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();
}
private void设置游戏(){
SetShuffleSound();
for(int i=0;i
有很多方法可以做到这一点。睡眠(500)是你建议的方式,但不是我建议的方式。这里有两种选择
一个例子
Handler mHandler = new Handler(){
public void handleMessage(Message msg){
super.handleMessage(msg);
switch(msg.what){
case shuffle:
// Do something
break;
case doneShuffle:
//Do something
}
}
};
以下是一个例子:
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
}
}
私有类shuffleCards扩展异步任务{
受保护的长沙发背景(卡片){
//做点什么
//洗牌组
//如果调用cancel(),则尽早退出
如果(isCancelled())中断;
}
返回甲板;
}
受保护的void onProgressUpdate(整数…进度){
//洗牌数量??
}
受保护的void onPostExecute(长结果){
//展示卡
}
}
请记住,这只是显示结果的后台任务。主线程将处理实际的卡值,并将它们交给异步任务
祝你好运你应该检查一下前面的SO问题,它接着解释了如何以你正在尝试的方式正确使用睡眠。你不需要任何线程,只需要使用一个处理程序并发送延迟消息就可以达到你想要的效果。事实上,在Android这样的事件驱动系统上,睡眠并不是实现这一点的正确方法。相反,你应该使用各种机制中的一种来安排未来的事件,并在该事件中处理下一张卡。@JoeBoyle-这是一个通用的Java答案,适用于创建控制台输出消息之间的最短时间,但对于Android UI编程来说,这不是一个特别合适的解决方案。您能创建一个Runnable,然后对其调用postDelayed()并将其传递500毫秒吗?
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
}
}