Handler原理

Handler是android子线程和主线程之间通信的一种机制。

主要包含四个类handler  looper  messagequeue  message

handler作用?

用来发送和处理消息的。

一个线程中多个handler发消息处理消息为什么不混乱?:

message.target = handler(当前发消息的handler)

Looper作用?:

通过loop(for死循环)查看当前的消息链表中是否有需要处理的message。

MessageQueue作用?

MessageQueue 存在的原因很简单,就是同一线程在同一时间只能处理一个消息,同一线程代码执行是不具有并发性,所以需要队列来保存消息和安排每个消息的处理顺序。多个其他线程往UI线程发送消息,UI线程必须把这些消息保持到一个列表(它同一时间不能处理那么多任务),然后挨个拿出来处理,这种设计很简单,我们平时写代码其实也经常这么做。每一个Looper线程都会维护这样一个队列,而且仅此一个,这个队列的消息只能由该线程处理。

用来存储message的链表(链表中的消息message是按when(当前系统的时间戳)从小到大的排列)。

Message作用?:

用来存储消息内容

如何把Handler,Looper,MessageQueue,Message串起来?

通过handler.sendMessage这个方法,把当前的消息对象message传入到handler中,通过handler中的messagequeue对象的引用,把Message放入到MessageQueue中。

在message存放的时候,message对象的target属性记录了当前的handler。message通过消息的执行时间when,从小到大排列插入到消息链表中。

我们looper的loop方法中的for(死循环)去查看当前的MessageQueue链表中是否有需要执行的Message。通过Message的when(消息的执行时间判断)和当前的系统时间戳做对比,如果当前的系统时间戳小于当前messagequeue链表中的消息执行时间,当前的执行进入等待状态。如果当前的系统时间戳大于或等于当前的MessageQueue链表中的消息执行时间,我们就把当前的message从消息链表中删除,并且把该消息返回给Looper的loop方法中。

在loop方法中获取到message以后判断message所对应的target是否存在,如果存在就调用target.dispathMessage方法把当前的message传入,在dispathMessage方法中,我们将调用handleMessage这个方法。把当前取出的message传出去。这样在我们handler中重写的handleMessage就拿到了当前处理的消息。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.handler基本信息: 定义:一套 Android 消息传递机制。 作用:在多线程的应用场景中,将工作线程中...
    梦源坦阅读 661评论 0 0
  • Handler是android子线程和主线程之间通信的一种机制。主要包含四个类handler looper m...
    残非阅读 194评论 0 0
  • Handler 原理 一、Handler消息发送机制 1. 发送消息 1.1 添加消息 调用Handler.sen...
    还是昵称啊阅读 279评论 0 0
  • 我的简书:https://www.jianshu.com/u/c91e642c4d90我的CSDN:http://...
    在代码下成长阅读 791评论 2 0
  • 在Android中,只有主线程才能更新UI,但是主线程不能进行耗时操作,否则会产生ANR异常,所以常常把耗时操作放...
    雷涛赛文阅读 1,137评论 1 2

友情链接更多精彩内容