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

我们如何在Android中使用runOnUiThread?

龙弘盛
2023-03-14

我是Android新手,我正在尝试使用UI线程,所以我写了一个简单的测试活动。但我想我误解了什么,因为点击按钮,应用程序不再响应

public class TestActivity extends Activity {

    Button btn;
    int i = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btn = (Button)findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runThread();
            }
        });
    }

    private void runThread(){
        runOnUiThread (new Thread(new Runnable() {  
            public void run() {
                while(i++ < 1000){
                    btn.setText("#"+i);
                    try {
                        Thread.sleep(300);
                    } 
                    catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
             }
        }));
    }
}

共有3个答案

姚才捷
2023-03-14

你把它背对背。您的按钮点击会导致对runOnUiThread()的调用,但这并不需要,因为点击处理程序已经在UI线程上运行。然后,您在runOnUiThread()中的代码将启动一个新的后台线程,您尝试在其中执行UI操作,但操作失败。

相反,只需直接从单击处理程序启动后台线程。然后,将对btn.setText()的调用包装在对runOnUiThread()的调用中。

乐山
2023-03-14

只需将其包装为函数,然后从后台线程调用此函数。

public void debugMsg(String msg) {
    final String str = msg;
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            mInfo.setText(str);
        }
    });
}
沈飞翼
2023-03-14

下面是经过更正的runThread函数片段。

private void runThread() {

    new Thread() {
        public void run() {
            while (i++ < 1000) {
                try {
                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            btn.setText("#" + i);
                        }
                    });
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
}
 类似资料:
  • **这是我要在旧代码中插入的新项目**<?xml 版本=“1.0”encoding=“UTF-8”?> **插入旧代码时显示v7小部件错误**<?xml 版本=“1.0”编码=“UTF-8”?>

  • 问题内容: 我想在colab.research.google.com中使用Chrome的Selenium Webdriver进行快速处理。我可以使用安装Selenium,但chrome的webdriver需要通向webdriverChrome.exe的路径。我应该如何使用它? PS- colab.research.google.com是一个在线平台,可为与深度学习相关的快速计算问题提供GPU。请避

  • 问题内容: 我有一个使用此函数运行线程的代码示例。我们为什么以及何时需要使用它? 编辑 怎么样来使用类,什么是和? 问题答案: 当您要从非UI线程更新UI时必须使用。例如-如果您想从后台线程更新UI。您也可以将其用于同一件事。 从文档- 在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将操作发布到UI线程的事件队列。 句法 - 更新- 如果您要执行

  • 本文向大家介绍我们如何在Java中使用JsonGenerator创建JSON?,包括了我们如何在Java中使用JsonGenerator创建JSON?的使用技巧和注意事项,需要的朋友参考一下 该JsonGenerator 是一个基类,定义了公共API编写JSON内容。实例是使用JsonFactory 实例的工厂方法创建的。一旦可以从工厂实例中获取JsonGenerator ,则可以使用writeS

  • 本文向大家介绍我们如何在HTML中使用不同的CSS类?,包括了我们如何在HTML中使用不同的CSS类?的使用技巧和注意事项,需要的朋友参考一下 在HTML中,根据元素的class属性定义样式规则。具有该类的元素将根据定义的规则进行格式化。这称为类选择器。要选择具有特定类的元素,需要编写一个句点(。)字符,后跟类的名称,例如.black 对于文档中class属性设置为black的每个元素,以黑色显示

  • 我在两台不同的机器上有两种不同的卡桑德拉设置。我试图从一台机器上读取数据,使用Spark进行处理,然后将结果写入第二个设置。我使用的是spark-cassandra-connector-java_2.10。当我尝试使用Java函数时。writeBuilder,它允许我指定键空间和表名,但Cassandra主机是从Spark上下文获取的。除了Spark上下文中提到的方法外,还有其他方法可以将数据写入