Handler与线程:
Handler与调用它的Activity处于同一线程中。
可以通过在activity中和handler中各自打印线程名称和id来验证。
也就是说,通过handler的post(Runnable)方法来执行一个Runnable,是直接调用了它的run()方法,而不是执行它的start()方法。
因此这种做法并不是我们想要的。
在新线程中处理handler的方法:
1、创建一个线程来处理,这个线程是专门的,叫做HandlerThread
- MyHandler myHandler = new MyHandler();
- Message msg = myHandler.obtainMessage();
2、创建一个Handler的子类,要求重载无参构造函数和一个带参数为Looper的构造函数,并override handlerMessage(Message)方法:
- class MyHandler extends Handler {
- public MyHandler() {
- }
- public MyHandler(Looper looper) {
- super(looper);
- }
- @Override
- public void handleMessage(Message msg) {
- System.out.println("handler--->" + Thread.currentThread().getId());
- Bundle bundle = msg.getData();
- int age = bundle.getInt("age");
- String name = bundle.getString("name");
- System.out.println(name + " " + age);
- }
- }
3、创建一个自定义类的对象,然后从其消息池中获取一个消息对象
- MyHandler myHandler = new MyHandler();
- Message msg = myHandler.obtainMessage();
4、对Message对象进行操作
a) 往Message中放入简单的整形数据,可以直接给Message的成员int arg1, arg2赋值
b) 往Message中放入简单的对象,可以直接给Message的成员Object obj赋值
c) 往Message中放入复杂的数据,调用Message.setData(Bundle)方法。
*一个Bundle可以理解为一个特殊的Map,只是这个Map的key的类型是固定为String类型的。Bundle不仅在消息中传递数据时可以使用,在intent中传递数据也可以使用。
5、将Message对象发送给目标
- // 不同于handler.send(Message),这是Message的方法,将msg发送给目标对象,
- // 所谓目标对象,就是生成该Message的handler对象。
- msg.sendToTarget();
示例程序完整源代码:
- package me.bym;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.HandlerThread;
- import android.os.Looper;
- import android.os.Message;
- public class HandlerTest2 extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- System.out.println("activity--->" + Thread.currentThread().getId());
- HandlerThread handlerThread = new HandlerThread("handler_thread");
- handlerThread.start();
- MyHandler myHandler = new MyHandler();
- Message msg = myHandler.obtainMessage();
- Bundle bundle = new Bundle();
- bundle.putInt("age", 21);
- bundle.putString("name", "Bao Yiming");
- msg.setData(bundle);
- // 不同于handler.send(Message),这是Message的方法,将msg发送给目标对象,
- // 所谓目标对象,就是生成该Message的handler对象。
- msg.sendToTarget();
- }
- class MyHandler extends Handler {
- public MyHandler() {
- }
- public MyHandler(Looper looper) {
- super(looper);
- }
- @Override
- public void handleMessage(Message msg) {
- System.out.println("handler--->" + Thread.currentThread().getId());
- Bundle bundle = msg.getData();
- int age = bundle.getInt("age");
- String name = bundle.getString("name");
- System.out.println(name + " " + age);
- }
- }
- }
摘录:http://blog.youkuaiyun.com/baoyiming1991/article/details/6301990