我正在使用数字构建我的第一个类似于MasterMind的应用程序和简单游戏。我想当PC试图找到我的号码时,在找到正确的号码之前不要立即显示他所做的所有尝试,但他会逐渐进行。例如,CPU说出第一个数字,等待一秒然后说出第二个数字,依此类推。这是代码:
public void startCPU() {
int num;
int strike;
int xx;
do {
do {
Random random = new Random();
num = random.nextInt((9876 - 123) + 1) + 123;
xx = (int) numpos.pox[num];
} while (xx == 0);
Numeri.Confronta(mioNumero, numpos.pox[num]);
int ball = Risultati.getBall();
strike = Risultati.getStrike();
TextView txtv = (TextView) findViewById(R.id.numberthatcpusay);
if (numpos.pox[num] < 1000) {
Integer x = numpos.pox[num];
String s = ("0" + Integer.toString(x) + " " + Integer.toString(strike) + "X "
+ Integer.toString(ball) + "O" + " ");
txtv.append(s);
} else {
Integer x = numpos.pox[num];
String s = (Integer.toString(x) + " " + Integer.toString(strike) + "X "
+ Integer.toString(ball) + "O" + " ");
txtv.append(s);
}
numeroDato = numpos.pox[num];
numpos.pox[num] = 0;
for (int i = 0; i <= 9876; i++) {
if (Risultati.checkStrikeAndBall(numeroDato, numpos.pox[i], strike, ball) == true) {
numpos.pox[i] = 0;
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (strike != 4);
startMe();
}
问题是textView不会每秒更新,但只有在CPU找到该号码后才会更新。通过这种方式,当我点击启动此方法的按钮时,我应该等待的时间才能看到结果与尝试次数相等。例如,如果CPU在找到正确的数字之前需要9个数字,我应该在textView显示所有尝试之前等待9秒。我该如何解决?
答案 0 :(得分:1)
你不能在UI线程上做到这一点!
你正在运行一个在UI线程上调用Thread.sleep()
的循环,这基本上会完全冻结手机。
考虑使用AsyncTask
。
在doInBackground
方法中你不在UI线程上,所以你可以调用sleep。
并且每秒计算新数字并调用publishProgress
来更新UI。
然后在onProgressUpdate
回调中,执行TextView.append()调用 - 因为它必须在UI线程上调用。