Android runOnUiThread 未执行

Android runOnUiThread not executing

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

我尝试了很多不同的解决方案,但其中 none 似乎没有用。在我的 while 循环代码中一直打印 "Started new loop",但它不会从 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();
}

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

而且你在 Thread 中的睡眠不会像这样工作。您想延迟无限 while 循环,因此您需要将 sleep on 移出 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 的建议去做。

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

if(rullaavaNumero > 0) {...