2017-04-16 5 views
0

Ich versuche, die Hintergrundfarbe eines View zu ändern, die als ein Quadrat fungiert, das neben anderen Tonbeispielen funktioniert.CalledFromWrongThreadException: beim Ändern der Ansicht Farbe (Android)

Wenn ich es laufen gehen, kommt es mit dem Fehler auf:

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

Kann jemand bitte eine Lösung?

@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")); 
      } 
     } 
    }; 

} 

Der Klang Teil des Codes funktioniert gut, es ist nur, wenn ich versuche View zu verwenden.

Antwort

0

Verschieben Sie stattdessen Ihren UI-Code in den UI-Thread. Sie können nicht ui Form Timertask

-Code aktualisieren:

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

void run Methode in Timer-Task auf einen neuen Thread und nicht UI-Thread. Sie können in diesem Thread keine Hintergrundfarbe festlegen. Sie sollten es wie folgt im UI-Thread tun.

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