Handler消息机制的一些原理(直接用code讲解)(二)

2014-11-24 09:21:51 · 作者: · 浏览: 1
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~~~"); } }