2

我有这个问题。我正在尝试TextView从另一个线程更新我的,但它不让我。

我尝试了一堆不同的解决方案,但似乎都没有帮助。在我的 while 循环代码中,一直在打印“开始新循环”,但它并没有从那个继续runOnUiThread

谁能帮我弄清楚如何TextView从另一个线程更新?

 //second thread
protected void startKakkosThread() {
    Thread t2 = new Thread() {
        public void run() {
            while (true) {
                System.out.println("Started new loop");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            if(rullaavaNumero >= 0) {
                                rullaavaNumero--;
                                System.out.println(rullaavaNumero);
                                pelaajanPisteetTeksi.setText("" + rullaavaNumero);
                                sleep(1000);
                            }else{
                                rullaavaNumero = 9;
                                System.out.println(rullaavaNumero);
                                pelaajanPisteetTeksi.setText("" + rullaavaNumero);
                                sleep(1000);
                            }
                        }catch (InterruptedException e){
                            e.printStackTrace();
                        }
                    }
                });
            }
        }
    };
    t2.start();
}
4

1 回答 1

1

这是一个快速修复,您有一个无限循环,其运行速度比线程有机会(时间)启动的速度更快。因此,即使这样,您也可以使用 if 语句在线程中休眠,如果线程从未启动,则休眠无效。

而且您在 Thread 中的睡眠不会像这样工作。您想延迟无限的 while 循环,因此您需要将 sleep 移出 while 循环中的线程。

仍然可以通过在其中添加额外的睡眠来延迟您的线程,但这一切都取决于您想要实现的目标。

您的最终代码如下所示:

protected void startKakkosThread() {
    Thread t2 = new Thread() {
        public void run() {
            while (true) {
                System.out.println("Started new loop");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (rullaavaNumero >= 0) {
                            rullaavaNumero--;
                            System.out.println(rullaavaNumero);
                            pelaajanPisteetTeksi.setText("" + rullaavaNumero);
                            // no need for sleep here
                            // sleep(1000);
                        } else {
                            rullaavaNumero = 9;
                            System.out.println(rullaavaNumero);
                            pelaajanPisteetTeksi.setText("" + rullaavaNumero);
                            // no need for sleep here
                            // sleep(1000);
                        }
                    }
                });

                // add this part
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    t2.start();
}

我已经对其进行了测试并且可以正常工作,您也可以按照@cricket 的建议进行操作。

我的眼睛看到了另一个问题,这不是您问题的一部分,但值得一提。我假设您想从 to 计数90如果是这种情况,您需要通过删除来更正以下行,=否则您会得到 counts until -1,因此您的代码行将如下所示:

if(rullaavaNumero > 0) {... 
于 2016-10-04T23:33:47.433 回答