当前位置: 首页 > 知识库问答 >
问题:

Android错误:只有创建视图层次结构的原始线程才能接触其视图[重复]

太叔景曜
2023-03-14

得到一个错误:android.view.ViewRootImpl$CalledFromWrongThreadException:只有创建视图层次结构的原始线程可以触摸它的视图。
我真的不知道为什么。

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button generate = (Button) findViewById(R.id.gen);
    final TextView dice1 = (TextView) findViewById(R.id.dice1);
    final TextView dice2 = (TextView) findViewById(R.id.dice2);
    final TextView dice3 = (TextView) findViewById(R.id.dice3);


    generate.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {           
            dice1.setText(" ");
            dice2.setText(" ");
            dice3.setText(" ");         
            Thread thread = new Thread()
            {
                @Override
                public void run() {
                    try {
                        while(true) {
                            sleep(2000);
                            setText("lol", "lol", "lol");
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            thread.start();             
        }

    });
}
public void setText(String d1, String d2, String d3){
    dice1.setText(d1);
    dice2.setText(d2);
    dice3.setText(d3);  
}

谢谢帮忙。

共有3个答案

韦阳晖
2023-03-14

您正在将一个线程上的setText设置为分开。将调用操纵UI组件的方法放在runOnUiThread块中。

滕英奕
2023-03-14

从字面上看,您正在尝试从错误的线程在视图中设置字段。您的OnClickListener创建了一个新线程,但只有创建视图及其层次结构的线程才能更改这些视图。

您可以重构以使用http://developer.android.com/reference/java/util/concurrent/ScheduledThreadPoolExecutor.html

或者,您可以将setter代码包装到runOnUiThread块中。此站点上有一个示例,以及为什么这可能不是一个好主意的警告:Android:RunOnUiThread vs AsyncTask。

东郭和光
2023-03-14

出现此错误是因为您在UI线程以外的其他线程中操作视图。您的方法修改了3个文本视图的文本(dice1、dice2、dice3)。

您应该使用runOnUiThread调用此方法,如下所示:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button generate = (Button) findViewById(R.id.gen);
    final TextView dice1 = (TextView) findViewById(R.id.dice1);
    final TextView dice2 = (TextView) findViewById(R.id.dice2);
    final TextView dice3 = (TextView) findViewById(R.id.dice3);

    generate.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {           
            dice1.setText(" ");
            dice2.setText(" ");
            dice3.setText(" ");         
            Thread thread = new Thread()
            {
                @Override
                public void run() {
                    try {
                        while(true) {
                            sleep(2000);
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    setText("lol", "lol", "lol");
                                }
                            });
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            thread.start();             
        }

    });
}
public void setText(String d1, String d2, String d3){
    dice1.setText(d1);
    dice2.setText(d2);
    dice3.setText(d3);  
}

 类似资料: