2014-05-04 58 views
-1

我是新來的多線程,所以請原諒我的潛在愚蠢的問題。如果你有多個使用runOnUiThread的線程,它們是不同的線程,還是它們都在一個線程上運行?

我需要在我的應用程序中使用幾個線程。但是,幾乎所有這些線程都會修改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

我需要在我的應用程序中使用多個線程。

爲什麼?例如,您不需要在上面的代碼示例中創建自己的線程。使用postDelayed()循環(無線程),或使用ScheduledExecutorService(線程,但不必創建它們)進行計時。

我擔心的是,如果我創建不同的相同類型的線程,它們將全部在一個線程上運行,即「Ui線程」,這可能會減慢我的應用程序。

我不知道「同一類型」是什麼意思。在上面的代碼片段中,您傳遞給runOnUiThread()Runnable中的所有內容都將在主應用程序線程(有時稱爲UI線程)上執行。您最外層的run()中的其他內容將在此後臺線程上執行。

+0

我正在尋找postDelayed和Handlers :)但是我不明白的東西 - 在onCreate()中創建的Handler仍然綁定到UI線程,還是創建了一個全新的線程?再次感謝你,夥計:) – BipBapApps

+0

@BipBapApps:「在onCreate()中創建的Handler仍然綁定到UI線程,還是創建了一個全新的線程?」 - 它綁定到主應用程序(UI)線程。如果你想把一個Handler綁定到另一個線程,可以使用HandlerThread。 – CommonsWare

0

您需要在UI線程上運行UI更新是正確的。因此你在UI線程上做了textGoldCount.setText(...)。從技術上講,這是一個正確的方法。

但是,每次更新文本字段時都不需要撥打setGravity(...)。你應該能夠設置重力一次。最好的地方應該是你的XML視圖描述。

最後,除了更新文本視圖的文本之外,您不需要在UI線程上做太多繁重的工作。由於每個線程在再次更新用戶界面之前都會休眠1秒,因此只要不會運行太多這些線程,用戶就不應該有明顯的延遲。

相關問題