【Android技术整理】Handler以及Handler如何实现多线程

来源:互联网 发布:重庆大学网络缴费平台 编辑:程序博客网 时间:2024/05/17 06:04

在Android应用的进程的主线程也就是UI线程中,都存在唯一一个Lopper和唯一一个MessageQueue(消息队列)。每个Handler对象的初始化必须被指定一个Lopper。Handler可以通过Lopper来循环执行消息队列中的Message,Message可以使来进程中任何线程发出的,这就提供了两种多线程处理的可能。


第一种,也是相对比较普遍的做法,就是启动一个Handler再主线程处理message,子线程通过给Handler发送消息来进行UI操作。

通过匿名内部类的方式声明一个handler,构造方法Handler()没有任何参数,默认使用当前UI进程的Looper。

匿名内部类中必须重写handleMessage(Message msg) 方法来进行消息处理。代码类似下面的样子:


      private final Handler handler = new Handler() {
            public void handleMessage(Message msg) {
                  switch (msg.what) {
                  case 1:
                        xxxxxxxx;
                        break;
                  case 2:
                        xxxxxxxx;

                        break;
                  case 3:
                        xxxxxxxx;

                        break;
                  }


                  super.handleMessage(msg);
            }
      };


发送Message的方法:

Message message = handler.obtainMessge();
message.what = 1;
message.sendToTarget();


也可以

Message message = new Message();
message.what = 1;
handler.sendMessage(message);

前者的效率更高。


Message 消息对象的几个比较重要的字段:

       arg1和arg2:用来存放需要传递的整型值
       obj:Object类型,我们可以让该字段传递某个多项到消息的接受者中。
       what:整形数据,用来做消息的唯一标志,在消息处理中,根据这个字段的不同的值进行不同的处理。


传递更复杂的数据时可以使用message.setData(Bundle data)


另一种,是定义一个新线程,用Handler在这个子线程中处理message。主(UI)线程给Handler发送消息,Handler在子线程中执行耗时操作。需要注意的是Android中除了UI线程(主线程),创建的工作线程默认是没有消息循环和消息队列的。如果想让该线程具有消息队列和消息循环,并具有消息处理机制,就需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。如以下代码所示:

class MyThread extends Thread {

    public Handler handler;

    public void run(){

        Lopper.prepare();

        handler = new Handler(Looper.myLooper());

        Lopper.loop();

    }

}



参考至:http://blog.sina.com.cn/s/blog_618199e60101g4vh.html


0 0
原创粉丝点击