当我在下面运行代码时,应用程序不会掉落:
@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”?
答案 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
方法不会检查线程访问。由于屏幕上还没有任何内容,因此没有问题。