Android——Handler(二)

本文详细介绍了如何在Android应用中利用Handler实现多线程处理,包括创建专用线程、自定义Handler类、消息的创建与发送、以及消息中的数据操作。重点阐述了如何在不同线程间传递数据并执行特定任务。

Handler与线程:

Handler与调用它的Activity处于同一线程中。

可以通过在activity中和handler中各自打印线程名称和id来验证。

也就是说,通过handlerpost(Runnable)方法来执行一个Runnable,是直接调用了它的run()方法,而不是执行它的start()方法。
因此这种做法并不是我们想要的。

 

在新线程中处理handler的方法:

1、创建一个线程来处理,这个线程是专门的,叫做HandlerThread

  1. MyHandler myHandler = new MyHandler();  
  2. Message msg = myHandler.obtainMessage();  

2、创建一个Handler的子类,要求重载无参构造函数和一个带参数为Looper的构造函数,并override handlerMessage(Message)方法:

  1. class MyHandler extends Handler {  
  2.           
  3.         public MyHandler() {  
  4.               
  5.         }  
  6.           
  7.         public MyHandler(Looper looper) {  
  8.             super(looper);  
  9.         }  
  10.         @Override  
  11.         public void handleMessage(Message msg) {  
  12.             System.out.println("handler--->" + Thread.currentThread().getId());  
  13.               
  14.             Bundle bundle = msg.getData();  
  15.             int age = bundle.getInt("age");  
  16.             String name = bundle.getString("name");  
  17.             System.out.println(name + " " + age);  
  18.         }  
  19.     }  

3、创建一个自定义类的对象,然后从其消息池中获取一个消息对象

  1. MyHandler myHandler = new MyHandler();  
  2. Message msg = myHandler.obtainMessage();  

4、Message对象进行操作

a) Message中放入简单的整形数据,可以直接给Message的成员int arg1, arg2赋值

b) Message中放入简单的对象,可以直接给Message的成员Object obj赋值

c) Message中放入复杂的数据,调用Message.setData(Bundle)方法。

*一个Bundle可以理解为一个特殊的Map,只是这个Mapkey的类型是固定为String类型的。Bundle不仅在消息中传递数据时可以使用,在intent中传递数据也可以使用。

5、Message对象发送给目标

  1. // 不同于handler.send(Message),这是Message的方法,将msg发送给目标对象,  
  2. // 所谓目标对象,就是生成该Message的handler对象。  
  3. msg.sendToTarget();  

 

示例程序完整源代码:

  1. package me.bym;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.os.Handler;  
  5. import android.os.HandlerThread;  
  6. import android.os.Looper;  
  7. import android.os.Message;  
  8. public class HandlerTest2 extends Activity {  
  9.     @Override  
  10.     protected void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.main);  
  13.           
  14.         System.out.println("activity--->" + Thread.currentThread().getId());  
  15.         HandlerThread handlerThread = new HandlerThread("handler_thread");  
  16.         handlerThread.start();  
  17.           
  18.         MyHandler myHandler = new MyHandler();  
  19.         Message msg = myHandler.obtainMessage();  
  20.           
  21.         Bundle bundle = new Bundle();  
  22.         bundle.putInt("age"21);  
  23.         bundle.putString("name""Bao Yiming");  
  24.         msg.setData(bundle);  
  25.           
  26.         // 不同于handler.send(Message),这是Message的方法,将msg发送给目标对象,  
  27.         // 所谓目标对象,就是生成该Message的handler对象。  
  28.         msg.sendToTarget();  
  29.     }  
  30.       
  31.     class MyHandler extends Handler {  
  32.           
  33.         public MyHandler() {  
  34.               
  35.         }  
  36.           
  37.         public MyHandler(Looper looper) {  
  38.             super(looper);  
  39.         }  
  40.         @Override  
  41.         public void handleMessage(Message msg) {  
  42.             System.out.println("handler--->" + Thread.currentThread().getId());  
  43.               
  44.             Bundle bundle = msg.getData();  
  45.             int age = bundle.getInt("age");  
  46.             String name = bundle.getString("name");  
  47.             System.out.println(name + " " + age);  
  48.         }  
  49.     }  


摘录:http://blog.youkuaiyun.com/baoyiming1991/article/details/6301990

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值