Looper中的消息队列处理机制

Looper也提供了消息的定义、消息的发送、消息的处理者的自定义和消息队列。在其头文件Looper.h中,定义了消息结构体Message,它只有一个类型成员,Message的定义如下(见文件Looper.h,下同):

消息的处理者可由MessageHandler进行处理:

使用者可通过派生出子类来扩展消息。对消息的处理,需要在MessageHandler的子类中重载handleMessage函数。

它们将被封装到消息“信封”MessageEnvolope中,然后送到消息队列中。MessageEnvolope的定义如下:

Looper中维护着一个自己的消息队列:

可以使用Looper的sendMessageAtTime(另外两个版本也最终都使用的是sendMessageAtTime)向消息队列中发送消息:

消息发送函数将根据实参,将它们打包到消息信封中,然后放置到消息队列中。最后,若消息队列中原先没有消息(即在接收方睡眠等待),则让wake函数写入字符到管道写端唤醒接收方在pollInner中epoll_wait上的睡眠等待,让其开始对消息接收处理。pollInner对消息队列的处理的代码片段如下:

当醒来后,在上面的行275若检查到消息队列不为空,则检查队列上的第一项是不是超时了。若超时了,则取下它,调用消息信封中指定的MessageHandler的handleMessage函数去处理消息(行294)。

因此,借助于Looper的sendMessageXXX函数和pollOnce函数,可以向Looper内部的消息队列发送消息,这时pollOnce的调用者将被唤醒去处理消息,当消息处理完毕和没有消息时,将会睡眠等待。

本文节选自《深入剖析Android系统》一书

杨长刚 著

电子工业出版社出版

Looper中的消息队列处理机制相关推荐

  1. 【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )

    文章目录 一.Message 消息 二.ThreadLocal 线程本地变量 三.Looper 中的消息队列 MessageQueue 一.Message 消息 模仿 Android 中的 Messa ...

  2. ZWave 中的消息队列机制

    文章主题 文章主题   在我们的日常编程中,对消息队列的需求非常常见,使用一个简洁.高效的消息队列编程模型,对于代码逻辑的清晰性,对于事件处理的高效率来说,是非常重要的.这篇文章就来看看 ZWave ...

  3. RTOS中的消息队列的原理以及应用

    消息队列的原理 RTOS中的消息队列是一种用于任务间通信的机制,它可以实现任务之间的异步通信,从而实现任务间的解耦.消息队列是一个先进先出的数据结构,任务可以向队列中发送消息,也可以从队列中接收消息. ...

  4. OSSIM中分布式消息队列应用

     OSSIM中分布式消息队列应用 1. 消息队列处理 企业日志数量正在以指数级形式高速增长,日志数据的具有海量.多样.异构等特点,基于传统的单一节点混合式安装的OSSIM平台(指OSSIM 4.4及以 ...

  5. python队列来做什么_python分布式爬虫中的消息队列是什么?

    当排队等待人数过多的时候,我们需要设置一个等待区防止秩序混乱,同时再有新来的想要排队也可以呆在这个地方.那么在python分布式爬虫中,消息队列就相当于这样的一个区域,爬虫要进入这个区域找寻自己想要的 ...

  6. GaussDB(DWS)中共享消息队列实现的三大功能

    摘要:本文将详细介绍GaussDB(DWS)中共享消息队列的实现. 本文分享自华为云社区<GaussDB(DWS)CBB组件之共享消息队列介绍>,作者:疯狂朔朔. 1)共享消息队列是什么? ...

  7. 智能家居DIY连载教程(2)——在实际项目中运用消息队列与邮箱

    前言 千呼万唤始出来,智能家居 DIY 教程连载第二篇终于登场了!本文将重点给大家介绍如何将消息队列与邮箱运用到实际项目中去.一起来看看吧~ DIY 回顾上期: 1.智能家居DIY连载教程(1)--如 ...

  8. RabbitMQ中的消息确认ACK机制

    我们将消息持久化后,假如消费端出现异常,rabbitmq服务器会将消息缓存到内存,当生产者发送一直发送消息而消费者都没有正常消费时消息就会将这些消息全部保存在内存,当我们的消息过多时,就可能导致rab ...

  9. 消息队列重要机制讲解以及MQ设计思路(kafka、rabbitmq、rocketmq)

    目录 <Kafka篇> 简述kafka的架构设计原理(入口点) 消息队列有哪些作用(简单) 消息队列的优缺点,使用场景(基础) 消息队列如何保证消息可靠传输 死信队列是什么?延时队列是什么 ...

  10. 详解SpringCloud中RabbitMQ消息队列原理及配置,一篇就够!

    作者:kosamino cnblogs.com/jing99/p/11679426.html 一.MQ用途 1.同步变异步消息 场景:用户下单完成后,发送邮件和短信通知. 运用消息队列之后,用户下单完 ...

最新文章

  1. IDA中的SIG应用
  2. CentOS 6安装详解及PXE 安装
  3. gitlab mysql启动不了_gitlab不支持mysql,这就是我学习PostgreSQL的原因
  4. Linux的pcel问题-bash: pecl: command not found
  5. mysql clob转string_Java获取Oracle中CLOB字段转换成String
  6. 计算机设备管理系统报告,设备管理信息化自查报告
  7. opencv python 直方图反向投影_python OpenCV学习笔记直方图反向投影的实现
  8. 【Flink】Class class org.apache.flink.types.Row cannot be used as a POJO type because not all fields a
  9. 云计算下一个十年,IT行业将发生哪些变化?
  10. 使用localResizeIMG3+WebAPI实现手机端图片上传
  11. 湖北省大数据发展行动计划(2016-2020年)
  12. java json转二进制数据_Json二进制数据
  13. 旧历九月十六是老爸的生日,现在我才晓得
  14. Java服务器处理图片上传
  15. dell服务器硬件参数提升速度,DELL R620服务器配置
  16. 大学四年总结——找工作是真的难
  17. unpivot行转列 oracle,oracle-行转列点评oracle11g sql新功能pivot/unpivot
  18. 计算机毕业设计ssm高校学报管理系统lt10k系统+程序+源码+lw+远程部署
  19. 下一代云原生应用交付会怎样发展?KubeVela帮大忙。
  20. 3D建模中的BIP骨骼镜像对称画是什么东西?

热门文章

  1. openjdk8之编译和debug
  2. LAMP 3.1 mysql的root密码重置
  3. atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException
  4. #leetcode刷题之路27-移除元素
  5. 小程序毫秒级倒计时(适用于拼团秒杀功能)
  6. Objective-C的动态特性
  7. python的类与继承
  8. IJCAI2021论文:MEDA:一种为小样本文本分类设计的结合数据增强的元学习框架
  9. 【BERT】BERT的嵌入层是如何实现的?看完你就明白了
  10. 【论文】本周论文推荐(11.23-11.29)