所谓ui线程非线程安全的,意思是指不能从飞ui线程即主线程更改ui。相信很多人都知道这个事项;先上如下代码:
public class MainActivity extends Activity {
Button button=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("main", Thread.currentThread().getName());
button=(Button)findViewById(R.id.one);
startThread(button);
}
public void startThread(Button button)
{
final Button lButton=button;
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Log.e("thread run", Thread.currentThread().getName());
lButton.setVisibility(View.INVISIBLE);
}
}).start();
}
当你看到如上代码的时候你是否一口咬定程序必崩,很遗憾的告诉你程序依然运行正常。再另一种情况:
public void onClick(View view)
{
Button button=(Button)view;
String name=button.getText().toString();
Intent intent=new Intent();
intent.setClass(this, ProfileActivity.class);
intent.putExtra("name", name);
this.startActivity(intent);
startThread(button);
}
当startThread方法在由用户点击按钮触发时,你是否已经犹豫这样会不会崩溃?答案是程序如约地挂了。注意到前面的startThread方法调用在oncreate中,此时还未调用onresume,你可以试试在onstar方法中调用,结果是onresume之前调用没有问题,之后便会崩溃。
最终结论:在ui界面没有出来之前即onresume方法还未调用时,非主线程中是可以更改ui界面的,在ui界面出来之后,任何子线程的ui操作都会崩溃。