我是多线程的新手,所以原谅我可能有些愚蠢的问题。
我需要在我的应用中使用多个线程。但是,几乎所有这些线程都将修改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();
}
感谢所有帮助!
答案 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秒,因此只要您不运行太多这些线程,用户就不会有明显的延迟。