刚刚启动应用程序 非UI线程修改 UI-错乱情况
刚启动应用程序 非UI线程修改 UI--错乱情况
在做项目时,偶尔写程序发现一个不经意的混乱事件!!如下代码:
public void onCreate(Bundle savedInstanceState) {
..
..
..
new Thread(new Runnable(){
public void run() {
// TODO Auto-generated method stub
btn_start_audio.setText("Confuse");
}
});
}
这时竟然可以运行成功,而且使button的text修改成功。没有报告"Only the original thread that created a view hierarchy can touch its views.“ 异常。
不过此次更改Button Text仍然是由UI线程完成的。因为在子线程启动之后,开始Run,而这时Button的Parent,或者是parent 的parent的(父视图的父视图) mParent.isLayoutRequested() 为true。导致子线程无法运行到 ViewRoot的requestLayout(),所以不会抛出上述异常。但是此时Button类里面的mText变量已经被更改了。当CPU切换到UI线程开始layout整个View 时,同时也就给Button 展现了一个 mText(刚才已经更新)。
new Thread(new Runnable(){
public void run() {
Thread.Sleep(500);
// TODO Auto-generated method stub
btn_start_audio.setText("Confuse");
}
});
}
这样就会出现异常。
在做项目时,偶尔写程序发现一个不经意的混乱事件!!如下代码:
public void onCreate(Bundle savedInstanceState) {
..
..
..
new Thread(new Runnable(){
public void run() {
// TODO Auto-generated method stub
btn_start_audio.setText("Confuse");
}
});
}
这时竟然可以运行成功,而且使button的text修改成功。没有报告"Only the original thread that created a view hierarchy can touch its views.“ 异常。
不过此次更改Button Text仍然是由UI线程完成的。因为在子线程启动之后,开始Run,而这时Button的Parent,或者是parent 的parent的(父视图的父视图) mParent.isLayoutRequested() 为true。导致子线程无法运行到 ViewRoot的requestLayout(),所以不会抛出上述异常。但是此时Button类里面的mText变量已经被更改了。当CPU切换到UI线程开始layout整个View 时,同时也就给Button 展现了一个 mText(刚才已经更新)。
new Thread(new Runnable(){
public void run() {
Thread.Sleep(500);
// TODO Auto-generated method stub
btn_start_audio.setText("Confuse");
}
});
}
这样就会出现异常。