【问题标题】:Android runOnUiThread not executingAndroid runOnUiThread 未执行
【发布时间】:2017-02-13 02:34:14
【问题描述】:

我有这个问题。我正在尝试从另一个线程更新我的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();
}

【问题讨论】:

  • 我认为你应该改用Handler 或者postDelayed
  • 您应该考虑为此使用 AsyncTask。

标签: android android-runonuithread


【解决方案1】:

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

而且你在线程中的睡眠不会像这样工作。您想延迟无限 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 的建议进行操作。

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

if(rullaavaNumero > 0) {... 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多