CalledFromWrongThreadException:改变视图颜色(Android)

时间:2017-04-16 18:05:08

标签: java android

我正在尝试更改View的背景颜色,该颜色充当与其他声音样本一起打勾的正方形。

当我去运行它时,它会出现错误:

  

ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。

有人可以提供解决方案吗?

@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时。

2 个答案:

答案 0 :(得分: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"));
                }
            });

答案 1 :(得分:0)

计时器任务中的void run方法是在新线程而不是UI线程上。你不能在这个线程中设置setBackgroundColor。您应该在UI线程中执行以下操作。

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