2017-04-16 79 views
0

我試圖更改View的背景顏色,它的作用與其他聲音樣本一起打勾。CalledFromWrongThreadException:在更改視圖顏色時(Android)

當我去運行它,它自帶了錯誤:

ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

任何人都可以請提供一個解決方案?

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.act2); 

    final View square = (View)findViewById(R.id.rec); 

    tone = new TimerTask() { 
     @Override 
     public void run() { 
      if (sound[0] % 4 != 0) { 
       s2.start(); 
       sound[0] += 1; 
       square.setBackgroundColor(Color.parseColor("#ff0000")); 
      } else { 
       s2.start(); 
       sound[0] = 1; 
       square.setBackgroundColor(Color.parseColor("#00ff00")); 
      } 
     } 
    }; 

} 

代碼的聲音部分工作正常,它只是當我嘗試使用View

回答

0

改爲將UI相關代碼移至UI線程。不能更新UI形式的TimerTask

代碼:計時器任務

tone = new TimerTask() { 
    @Override 
    public void run() { 
     if (sound[0] % 4 != 0) { 
      s2.start(); 
      sound[0] += 1; 
      runOnUiThread(new Runnable() { 
      @Override 
       public void run() { 
        square.setBackgroundColor(Color.parseColor("#ff0000")); 
       } 
      }); 
0

無效的run方法是在一個新的線程,而不是UI線程。你不能在這個線程中設置背景顏色。你應該在UI線程中做到這一點,如下所示。

runOnUiThread(new Runnable() { 
     @Override 
      public void run() { 
       square.setBackgroundColor(Color.parseColor("#ff0000")); 
      } 
     });