TextView不同步

时间:2015-10-28 09:29:42

标签: java android multithreading textview synchronization

我正在使用数字构建我的第一个类似于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秒。我该如何解决?

1 个答案:

答案 0 :(得分:1)

你不能在UI线程上做到这一点!

你正在运行一个在UI线程上调用Thread.sleep()的循环,这基本上会完全冻结手机。

考虑使用AsyncTask

doInBackground方法中你不在UI线程上,所以你可以调用sleep。 并且每秒计算新数字并调用publishProgress来更新UI。 然后在onProgressUpdate回调中,执行TextView.append()调用 - 因为它必须在UI线程上调用。