
Handler消息机制的一些原理(直接用code讲解)(二)
ton3: {
myHandlerDemo = new HandlerDemo();
OtherThread otherThread = new OtherThread(myHandlerDemo);
otherThread.start();
}
break;
case R.id.button4: {
errorHandlerThread errorHandlerThread = new errorHandlerThread(
button4);
errorHandlerThread.start();
}
break;
default:
break;
}
}
/*
* MyThread 是内部类,子线程
*/
private class MyThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
// 1.error: 只能在UI线程中采用不带Looper对象创建Handler对象,所以此处会报异常
// myHandlerDemo = new HandlerDemo();
// 2.error: Looper.myLooper获取的Looper是null,所以也会报异常
// myHandlerDemo = new HandlerDemo(Looper.myLooper());
// 通过Looper.getMainLooper()可以得到父类的looper,所以可以成功创建handler对象并绑定MessageQueue
myHandlerDemo = new HandlerDemo(Looper.getMainLooper());
Message message = myHandlerDemo.obtainMessage(2,
(Object) ("Hello,My name is Handler2~~"));
message.sendToTarget();
}
}
private/**
* 创建一个Handler
*
* @author xiaoyaomeng
*
*/
class HandlerDemo extends Handler {
/* 在UI线程中创建handler时,可以直接调用这个构造函数 */
public HandlerDemo() {
super();
// TODO Auto-generated constructor stub
}
/* 在子线程中创建一个Handler需要用到这个构造函数,否则报错 */
public HandlerDemo(Looper looper) {
super(looper);
// TODO Auto-generated constructor stub
}
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch (msg.what) {
case 1: {
button1.setText(msg.obj.toString());
}
break;
case 2: {
button2.setText(msg.obj.toString());
}
break;
case 3: {
button3.setText(msg.obj.toString());
}
break;
default:
break;
}
}
}
}
/**
*
* 其他线程的类,用来接收一个handler,并在线程中 用这个handler发送消息
*
* @author xiaoyaomeng
*
*/
class OtherThread extends Thread {
private Handler mHandler;
public OtherThread(Handler handler) {
// TODO Auto-generated constructor stub
mHandler = handler;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
Message message = mHandler.obtainMessage(3,
(Object) ("Hello,My name is Handler3~~"));
message.sendToTarget();
}
}
/**
* 测试错误报错的线程
*
* @author xiaoyaomeng
*
*/
class errorHandlerThread extends Thread {
Button button = null;
public errorHandlerThread(Button button) {
// TODO Auto-generated constructor stub
this.button = button;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
button.setText("hahahaha~~~");
}
}