2016-08-03 49 views
6

我試圖在每半秒運行一次for循環。每次調用循環時都會改變視圖中的某些內容,但是這些改變是由另一個類別即速度表完成的。Android「只有創建視圖層次結構的原始線程可以觸及其視圖。」for循環中的錯誤

Thread thread=new Thread(){ 
     @Override 
     public void run() { 
      float i; 
      try { 

       for (i = 0; i <= 100; i++) { 
          Speedometer1.onSpeedChanged(Speedometer1.getCurrentSpeed(i) + 8); 
          Speedometer2.onSpeedChanged(Speedometer2.getCurrentSpeed(i) + 8); 
          Speedometer3.onSpeedChanged(Speedometer3.getCurrentSpeed(i) + 8); 
          Speedometer4.onSpeedChanged(Speedometer4.getCurrentSpeed(i) + 8); 
          Speedometer5.onSpeedChanged(Speedometer5.getCurrentSpeed(i) + 8); 
          Speedometer6.onSpeedChanged(Speedometer6.getCurrentSpeed(i) + 8); 


        sleep(500); 
       } 
      } 
      catch (InterruptedException e) 
      {e.printStackTrace();} 
     } 
    };thread.start(); 
+2

參考[安卓「只有創建視圖層次結構的原始線程可以觸及其視圖。「](http://stackoverflow.com/questions/5161951/android-only-the-original-thread-that-c​​reated-a-view-hierarchy-can -touch-its-vi) –

回答

9

這是因爲任何觀點只能在主線程和UI線程修改。嘗試使用runOnUiThread()運行onSpeedChanged()。像這樣:

Thread thread=new Thread(){ 
    @Override 
    public void run() { 
     float i; 
     try { 

      for (i = 0; i <= 100; i++) { 
       runOnUiThread(new Runnable() { 
        public void run() { 
         Speedometer1.onSpeedChanged(Speedometer1.getCurrentSpeed(i) + 8); 
         Speedometer2.onSpeedChanged(Speedometer2.getCurrentSpeed(i) + 8); 
         Speedometer3.onSpeedChanged(Speedometer3.getCurrentSpeed(i) + 8); 
         Speedometer4.onSpeedChanged(Speedometer4.getCurrentSpeed(i) + 8); 
         Speedometer5.onSpeedChanged(Speedometer5.getCurrentSpeed(i) + 8); 
         Speedometer6.onSpeedChanged(Speedometer6.getCurrentSpeed(i) + 8) 

        } 

       }); 


       sleep(500); 
      } 
     } 
     catch (InterruptedException e) 
     {e.printStackTrace();} 
    } 
};thread.start(); 
+0

完美運行...非常感謝 – Ariel

5

你應該runOnUIThread。樣品代碼更新UI組件是

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 

     //stuff that updates ui 

    } 
}); 
+1

非常感謝,它工作! – bboydflo

0

您不能從主線程外部修改View對象。即使您的Speedometer類正在進行更改,它仍在您創建的輔助線程中運行。

您可以創建一個Runnable併發布到主線程創建的Handler或使用其他類似的技術來實現相同。

3

你應該在UI線程上更新你的UI。

對於這一點,在你的onCreate創建一個處理程序()方法:

private Handler mHandler; 

@Override 
public void onCreate() { 
    mHandler = new Handler(); 
    // ... 
} 

然後調用在單獨的線程處理程序來執行它在主線程:

mHandler.post(new Runnable() { 
    @Override 
    public void run() { 
     // Update your UI 
    } 
}); 
相關問題