如果你有多个线程使用runOnUiThread,它们是不同的线程,还是它们都在一个线程上运行?

时间:2014-05-04 11:01:05

标签: java android multithreading

我是多线程的新手,所以原谅我可能有些愚蠢的问题。

我需要在我的应用中使用多个线程。但是,几乎所有这些线程都将修改UI。我已成功使用runOnUiThread,但我担心的是,如果我创建相同类型的不同线程,它们都将在一个线程上运行,即“Ui线程”,这可能会减慢我的应用程序。

这是真的吗,还是我非常误解?

我将基本上成倍增加的话题:

private void goldPerSecondMethod() {

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

                        @Override
                        public void run() {
                            goldCount += 0.1f;
                            textGoldCount.setText(goldCount + " Gold");
                            textGoldCount.setGravity(Gravity.CENTER);

                        }
                    });
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
}

感谢所有帮助!

2 个答案:

答案 0 :(得分:0)

  

我需要在我的应用中使用多个线程。

为什么呢?例如,您不需要在上面的代码示例中创建自己创建的线程。使用postDelayed()循环(无线程),或使用ScheduledExecutorService(线程,但您不必创建它们)进行计时。

  

我担心的是,如果我创建相同类型的不同线程,它们将全部运行在一个线程上,即#34; Ui线程&#34;,这可能会减慢我的应用程序。

我不知道&#34;同一类型&#34;手段。在上面的代码段中,传递给Runnable的{​​{1}}中的所有内容都将在主应用程序线程(有时称为UI线程)上执行。最外层runOnUiThread()中的所有其他内容都将在此后台主题上执行。

答案 1 :(得分:0)

您需要在UI线程上运行UI更新是正确的。因此,您在UI线程上执行textGoldCount.setText(...)。从技术上讲,这是一种正确的方法。

但是,每次更新文本字段时都无需致电setGravity(...)。你应该能够设置一次引力。最好的地方可能是你的XML视图描述。

最后,除了更新文本视图的文本外,您不会在UI线程上做太多繁重的工作。由于每个线程在再次更新UI之前都处于休眠状态1秒,因此只要您不运行太多这些线程,用户就不会有明显的延迟。