为什么android不会出现错误“CalledFromWrongThreadException”?

时间:2013-10-19 10:35:32

标签: android multithreading

当我在下面运行代码时,应用程序不会掉落:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    final Button b = (Button)findViewById(R.id.button1);
    new Mt(b).start();

}

此代码落下(当我点击button1时出现错误“CalledFromWrongThreadException”):

@Override
protected void onCreate(Bundle savedInstanceState) {
    ....
    final Button b = (Button)findViewById(R.id.button1);
    b.setOnClickListener(new Button.OnClickListener() {         
            @Override
            public void onClick(View v) {
                new Mt(b).start();
            }
        });

} 

Mt类的位置

class Mt extends Thread{
    Button b;
    Mt(Button b){
        this.b=b;
    }
    @Override
    public void run() {
        b.setText("4");
    }
}

为什么第一个示例不会出现错误“CalledFromWrongThreadException”?

2 个答案:

答案 0 :(得分:0)

线程将在非UI线程中运行。 UI相关操作必须在UI线程中完成。修改thread.run()方法中的代码

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

       @Override
       public void run() {
       // TODO Auto-generated method stub
           b.setText("4");  
       }
   });

}

答案 1 :(得分:0)

这只是一种预感,但第一个示例并没有失败,因为在执行onCreate期间没有UI。在实际计划更改用户可见的内容之前,setText方法不会检查线程访问。由于屏幕上还没有任何内容,因此没有问题。