当启动一个应用程序时,应用程序会开启一个UI主线程,由它来更改UI,创建的子线程是不能直接更改UI界面的,但要在子线程中更改UI 时,可以使用handler,让子线程和创建handler的线程(主线程)进行通信,让主线程去更改UI,还可以使用Message对象在通信时传递数据,还可以使用
message.what来自定义消息代码,让每个handler有自己的消息代码,不会和其他的handler冲突。
比如说:在主线程中创建handler,
private Handler mHandler= new Handler() { public void handleMessage(android.os.Message msg) { if (msg.what == 1) {
Toast.makeText(MainActivity.this, "真", Toast.LENGTH_SHORT).show();} else {
Toast.makeText(MainActivity.this, "假", Toast.LENGTH_SHORT).show();} } ;};
在子线程中发送Message对象到handler所在的主线程中:
Message message = new Message(); if (true) { mHandler.sendMessage(message);//发送message信息 message.what = 1;//标志是哪个线程传数据 } else { mHandler.sendMessage(message); message.what = 2; }这样就可以在子线程中更改UI了(显示Toast);
handler还可以实现子线程给子线程发送消息,但在非主线程中直接new Handler()是会报错的,因为非主线程默认是没有创建Looper对象的,但只要在构造Handler时传入Looper就好了,也可以直接获取线程的Looper对象(mHandler = new Handler(Looper.getMainLooper());)。