0

当我运行下面的代码时,应用程序不会下降:

@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”?

4

2 回答 2

0

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

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

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

}
于 2013-10-19T10:40:22.990 回答
0

这只是一种预感,但第一个示例并没有失败,因为在执行onCreate. 该setText方法中不会发生线程访问检查,直到它实际计划更改用户可见的某些内容。由于尚未将任何内容绘制到屏幕上,因此没有问题。

于 2013-10-19T10:59:10.383 回答