同一线程内多Handler使用浅析

转载自:https://blog.csdn.net/u011573355/article/details/50735604

做android开发的人都知道Handler处理机制,handler的出现就是为了保证UI线程安全,对UI的修改只有UI线程可以操作,不允许其他线程操作,下面对Handler异步消息处理机制再做一下简单的介绍:
1、成员介绍
Message:主要功能是进行消息的封装,同时可以指定消息的操作形式;
Looper:消息循环泵,用来为一个线程跑一个消息循环。每一个线程最多只可以拥有一个。
MessageQueue:就是一个消息队列,存放消息的地方。每一个线程最多只可以拥有一个。
Handler:消息的处理者,handler 负责将需要传递的信息封装成Message,发送给Looper,继而由Looper将Message放入MessageQueue中。当Looper对象看到MessageQueue中含有Message,就将其广播出去。该handler 对象收到该消息后,调用相应的handler 对象的handleMessage()方法对其进行处理。
2、同线程各成员的关系及数量
①一个线程中只能有一个Looper,只能有一个MessageQueue,可以有多个Handler,多个Messge;
②一个Looper只能维护唯一一个MessageQueue,可以接受多个Handler发来的消息;
③一个Message只能属于唯一一个Handler;
④同一个Handler只能处理自己发送给Looper的那些Message;

理清各成员之间的关系就好办了,网上好多都是在其他线程中Handler讲解,下面我来简单说一下在同一线程中,多个handler的用法,有的人可能会说,同一个线程为啥还要多个Handler,其实就是为了相互独立,互不干扰,各自处理各自的消息,比如说Handler1收到一个点击消息,它想将消息队列里面的所有点击消息,那它可以通过removeMessages(int what) 方法清除,这时如果handler2如果也有点击消息,就不会受到影响,因为谁发的Message,谁处理。
举个例子:
第一个Handler:

Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);

            switch (msg.what) {
            case LOOP_DISPLAY:              
                mHandler.sendEmptyMessageDelayed(LOOP_DISPLAY, 2000);               
                break;
            case MANUAL:
                mHandler.removeMessages(LOOP_DISPLAY);
                break;
            default:
                break;
            }
        }

    };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

第二个Handler 在另外一个类中

Handler mHandler1 = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);

            switch (msg.what) {
            case LOOP_DISPLAY:              
                mHandler1.sendEmptyMessageDelayed(LOOP_DISPLAY, 2000);              
                break;
            case MANUAL:                
                break;
            default:
                break;
            }
        }

    };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

这两个类中的handler在同一个线程中,因此会共用同一个looper和同一个MessageQueue,但是当第一个handler调用mHandler.removeMessages(LOOP_DISPLAY);只是让mHandler停止接收LOOP_DISPLAY消息,而mHandler1的LOOP_DISPLAY消息如果存在会继续接收,两者互不干扰,这是由于消息队列中的每一个Message都会绑定它自己的handler,只有自己的发送该消息的handler才能处理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章