源码分析Handler机制

本文深入解析Android中的Handler机制,包括消息(Message)的创建与传递、Handler的创建与使用、Looper的轮询机制以及消息队列(MessageQueue)的工作原理。通过详细讲解每个组件的功能和作用,帮助读者理解整个消息处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Handler机制

  • Message(消息)
    • 消息的创建:
      • 调用Message.obtain()方法,当sPool消息池为空就创建消息对象
    • 消息的next属性:
      • 消息对象通过next属性指向下一个消息对象
    • 消息的when属性:
      • long类型变量when,记录自己发送时间
    • 消息的target成员变量:
      • 消息对象中有一个Handler类型的成员变量target
      • 这个target记录此消息对象是由哪个Handler创建的
      • 多个Handler对象给消息队列发送消息,最终消息由谁处理,取决于消息由谁发送。(谁发送谁处理)
      • 处理消息时调用Message.target.handleMessage();也就是Handler.handleMessage();
  • Handler(处理器)
    • Handler的创建:
      • 应用启动时候,ActivityThread主线程会创建Handler和MessageQueue,并启动Handler
    • handler发送消息:
      • Handler.sendMessage();发送消息
    • Handler处理消息:
      • Handler.handleMessag();处理消息
  • Looper(轮循器)
    • Lopper何时开始轮循:
      • 只有当主线程ActivityThread调用Looper.loop();才开始轮循
      • Looper.loop();是个while(true){}的死循环
    • Looper轮循的原理:
      • 由于android的内核是Linux,所以也继承了Linux的进程间通信机制–“管道”
      • 管道的原理:
        • 在内存中有一个特殊的文件,这个文件有两个句柄(引用),一个是读取句柄,一个是写入句柄。
        • 内存中会有一块共享空间和两个流,一个主线程的读操作,一个子线程的写操作
        • 只有当子线程进行写操作时,主线程才会进行写操作
      • Looper的原理:
        • 主线程Looper从消息队列读取消息,当读完所有消息时,进入睡眠,主线程阻塞。
        • 子线程往消息队列发送消息,并且往管道文件写数据,主线程即被唤醒,从管道文件读取数据
        • 主线程被唤醒只是为了读取消息,当消息读取完毕,再次睡眠
  • MessageQueue(消息队列)
    • 消息队列的数据结构:
      • MessageQueue是个队列结构,但由于Message对象通过next指向下一个消息对象,所以又类似于单链表结构
    • 消息入队:
      • MessageQueue.enquqeueMessage(Message msg,long when);将消息入队
      • MessageQueue处理消息的顺序由when决定,when越小越靠前
      • 当(p == null || when==0 || when < p.when)将消息插入队首,优先处理
      • 否则比较when参数确定消息所在位置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值