Handler通信机制Message,MessageQueue,Handler,Looper讲解及常见面试问题

 Handler异步通信机制网上的文章已经非常多了,看完文章都觉得好像理解,但一说又有些模糊,为了方便理解,决定用交互图的方式把整个过程画出来,会有一个更清晰的任务;画时序图使用在线Process On工具;

Handler机制时序图

 Handler异步通信机制可以简单分解为几个阶段:

  1. 时序图中1-10步骤为新建Looper实例的阶段,关联消息队列MessageQueue;
  2. 时序图中11-18步骤为将Looper实例与所属线程绑定,Thread线程下私有threadLocals(ThreadLocal#ThreadLocalMap类型,类似Map存储方式)变量以ThreadLocal为key,Looper实例做value存储;
  3. 时序图中19-31步骤为完成Handler和线程绑定的Looper、MessageQueue建立关联关系;
  4. 时序图中32-34步骤为获取消息Message载体,Message的target为当前所属的Handler,即指定Message最终发给那个Handler处理器处理;
  5. 时序图中35-37步骤为将Message消息载体调用MessageQueue的enqueueMessage(message)加入消息队列;
  6. 时序图中38-44步骤为Looper调用loop()方法开发MessageQueue消息队列读取,然后获取Message,通过Message的target派发给相应的Handler处理;
  7. 时序图中44-45步骤为MessageQueue消息队列退出,主线程不允许退出消息队列,非主线程可以退出消息队列;

1.Handler,Message,MessageQueue,Looper类之间关系

Handler,Message,MessageQueue,Looper依赖关系;

 

  • Handler是针对开发人员使用,负责发送消息Message到消息队列,消息Message的处理;Handler持有Looper和MessageQueue,Handler实际持有的Looper实例下的MessageQueue对象Handler发送消息Message时最终调用MessageQueue.enqueueMessage(Message,long)方法将消息加入消息队列;派发消息基于Message指定的target(Handler).dispatchMessage(msg)处理消息基于Handler.handleMessage()处理
  • Looper实现消息的循环调用,Looper内部实现了Looper实例和所属线程的绑定同时创建MessageQueue队列实例Looper提供loop()方法实现读取消息死循环,MessageQueue.next()返回Message,调用Message.target.dispatchMessage(msg)派发消息
  • MessageQueue存放Message消息单链表,提供对Message操作方法,添加消息队列,读取消息,退出消息队列等;
  • Message消息载体,携带了信息和处理Message的Handler,what参数用于区分动作类型,when代表执行时间点,target目标Handler即由哪个处理器处理Message,next单链表存储Message,arg1、arg2、obj、data四个参数主要用于存储传递信息,其他参数参考Message源码即可;尽管Message有public的默认构造方法,但是你应该通过Message.obtain()或者Handler.obtainMessage()来从消息池中获得空消息对象,以节省资源。

注意:主线程(即UI线程)启动时,Looper同时会创建一个实例,同时与主线程绑定,一个线程对应一个Looper实例,Looper构造函数同时会创建一个消息队列MessageQueue,一个Looper实例对应一个MessageQueue实例,MessageQueue采用单链表(先进先出)的方式存储MessageHandler在构造函数中通过Looper.myLooper()获取所属线程绑定的LooperMessageQueueMessageQueue不对外开放;

自定义Looper线程示例:

* <pre>
  *  class LooperThread extends Thread {
  *      public Handler mHandler;
  *
  *      public void run() {
  *          Looper.prepare();
  *
  *          mHandler = new Handler() {
  *              public void handleMessage(Message msg) {
  *                  // process incoming messages here
  *              }
  *          };
  *
  *          Looper.loop();
  *      }
  *  }</pre>

2.Handler,Message,Mes

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值