当前位置: 首页 > 知识库问答 >
问题:

Android runOnUiThread未执行

梁丘诚
2023-03-14

我有这个问题。我试图从另一个线程更新我的< code>TextView,但它不允许。

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

有人能帮我找出如何从另一个线程更新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();
}

共有1个答案

黎震博
2023-03-14

这里有一个快速修复方法,你有一个无限循环,运行速度比线程有机会(时间)启动的速度快。因此,即使这样,您的线程中有一个带有if语句的sleep,如果线程从未启动,那么sleep就没有任何效果。

你在线程中的睡眠不会像这样工作。您希望延迟无限while循环,因此需要将睡眠移出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();
}

我已经测试过了,它是有效的,你也可以按照板球的建议去做。

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

if(rullaavaNumero > 0) {... 
 类似资料:
  • 我有@test Annotaion的测试市场。但是当我运行测试用例时,它显示测试运行:0,失败:0,跳过:0我正在从Eclipse中运行测试用例。我已经在Eclipse中安装了testng插件。 @test中的属性是自定义的。 TestNG版本:6.8.0

  • 问题内容: 我已经尝试了这两个代码,但是却没有执行,有人可以告诉我为什么吗? 提前致谢 问题答案: 试试这个代码: 它会在源元素的位置单击并按住,移至目标元素的位置,然后释放鼠标。 要么 它将单击并按住源元素的位置,移动给定的偏移量,然后释放鼠标。 要么 它将执行以上两个代码的操作。 我在Java上编写此代码。您可以转换为指定的语言。 从动作引用。

  • 我想对我的实体更新进行审核。所以我实现了EmptyInterceptor My方法未执行,但执行了

  • 我试图实现一个简单的Spring AOP(v4)示例,使用建议和一个原位切入点表达式,但是没有调用方面方法。我有所有必需的依赖关系(spring-aop、aopalliance和aspectweaver)。我做错了什么? 方面:

  • 我正试图把普罗米修斯加入我的Spring靴项目。我正在使用Spring Boot执行器来公开度量endpoint。我按照教程做了所有的事情,但我总是得到一个404错误。我还尝试了中给出的每一个解决方案: context.xml(外部属性):

  • Maven项目标志错误:未能执行goal org.springframework.boot:spring-boot-maven-plugin:2.1.3。release:repackage(repackage)on project pet-clinic-data:repackage of goal org.springframework.boot:spring-boot-maven-plugin: