导航:首页 > 操作系统 > android消息队列模型

android消息队列模型

发布时间:2023-09-07 08:06:00

1. android 中使用MQTT(第一篇)

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议。它是一种发布/订阅,极其简单和轻量级的消息传递协议,专为受限设备和低带宽,高延迟或不可靠的网络而设计。它的设计思想是轻巧、开放、简单、规范,易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是对于受限的环境如机器与机器的通信(M2M)以及物联网环境。相对于XMPP,MQTT更加轻量级,并且占用的宽带低。

MQTT协议有以下特点:

那么问题来了?重连连接成功后重复接收到最后一条消息
MQTT推送消息订阅端重复接收问题。
(背景)订阅端断开的时候,发布端多次推送消息。
(现象)订阅端启动时,接收到最后一条推送消息有两次;即使Qos设置为2;依然是两次。
经排查是因为
MqttMessage的Retained设置为了true;
该值很多文章上只说了是 消息保留机制,若设置为true,mqtt服务器会保留每次发布的消息;较少提到 若订阅某主题的客户端重启,则会把此主题之前发布的消息重新推送到客户端。该值默认为false;去掉修改该值即可
那么问题来了?重连连接后手动那么多遗漏的消息,怎么选择只接收最新的一条消息呢?
MQTT推送消息订阅端重复接收问题。
(背景)订阅端断开的时候,发布端多次推送消息。
(现象)订阅端启动时,接收到msg1,msg2,msg3 (这三个消息都是同一个类型消息,只需要处理最新的msg3就好,不然界面会刷新三次)这个谁有什么好办法没呢?

GitHub地址: https://github.com/eclipse/paho.mqtt.android
mqtt的官方文档: http://mqtt.org/documentation
Github上有中文翻译: https://github.com/mcxiaoke/mqtt

在mole的build.gradle文件中添加依赖

在 AndroidManifest.xml 添加限权

在 AndroidManifest.xml 注册Service (MyMqttService为自己写的服务,下文会讲到)

2. 深入分析Android-Handler消息机制

Handler是Android消息机制的上层接口。通过它可以轻松地将一个任务切换到Handler所在的线程中去执行。通常情况下,Handler的使用场景就是 更新UI 。

在子线程中,进行耗时操作,执行完操作后,发送消息,通知主线程更新UI。

Handler消息机制主要包括: MessageQueue 、 Handler 、 Looper 这三大部分,以及 Message 。

从上面的类图可以看出:

MessageQueue、Handler和Looper三者之间的关系: 每个线程中只能存在一个Looper,Looper是保存在ThreadLocal中的。 主线程(UI线程)已经创建了一个Looper,所以在主线程中不需要再创建Looper,但是在其他线程中需要创建Looper。 每个线程中可以有多个Handler,即一个Looper可以处理来自多个Handler的消息。 Looper中维护一个MessageQueue,来维护消息队列,消息队列中的Message可以来自不同的Handler。

在子线程执行完耗时操作,当Handler发送消息时,将会调用 MessageQueue.enqueueMessage ,向消息队列中添加消息。 当通过 Looper.loop 开启循环后,会不断地从消息池中读取消息,即调用 MessageQueue.next , 然后调用目标Handler(即发送该消息的Handler)的 dispatchMessage 方法传递消息, 然后返回到Handler所在线程,目标Handler收到消息,调用 handleMessage 方法,接收消息,处理消息。

从上面可以看出,在子线程中创建Handler之前,要调用 Looper.prepare() 方法,Handler创建后,还要调用 Looper.loop() 方法。而前面我们在主线程创建Handler却不要这两个步骤,因为系统帮我们做了。

初始化Looper

从上可以看出,不能重复创建Looper,每个线程只能创建一个。创建Looper,并保存在 ThreadLocal 。其中ThreadLocal是线程本地存储区(Thread Local Storage,简称TLS),每个线程都有自己的私有的本地存储区域,不同线程之间彼此不能访问对方的TLS区域。

开启Looper

创建Handler

发送消息

post方法:

send方法:

3. Andriod是不是每个线程都有消息队列

你好
很高兴为你解答

答案是:
熟悉Windows编程的朋友可能知道Windows程序是消息驱动的,并且有全局的消息循环系统。而Android应用程序也是消息驱动的,按道 理来说也应该提供消息循环机制。实际上谷歌参考了Windows的消息循环机制,也在Android系统中实现了消息循环机制。Android通过 Looper、Handler来实现消息循环机制,Android消息循环是针对线程的(每个线程都可以有自己的消息队列和消息循环)。本文深入介绍一下 Android消息处理系统原理。
前面提到Android系统的消息队列和消息循环都是针对具体线程的,一个线程可以存在(当然也可以不存在)一个消息队列和一个消息循环 (Looper),特定线程的消息只能分发给本线程,不能进行跨线程,跨进程通讯。但是创建的工作线程默认是没有消息循环和消息队列的,如果想让该线程具 有消息队列和消息循环,需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。

满意请采纳,谢谢

4. Android的handler机制的原理

Android的handler机制的原理分为异步通信准备,消息发送,消息循环,消息处理。

1、异步通信准备

在主线程中创建处理器对象(Looper)、消息队列对象(Message Queue)和Handler对象。

2、消息入队

工作线程通过Handler发送消息(Message) 到消息队列(Message Queue)中。

3、消息循环

消息出队: Looper循环取出消息队列(Message Queue) 中的的消息(Message)。

消息分发: Looper将取出的消息 (Message) 发送给创建该消息的处理者(Handler)。

4、消息处理

处理者(Handler) 接收处理器(Looper) 发送过来的消息(Message),根据消息(Message) 进行U操作。

handler的作用

handler是android线程之间的消息机制,主要的作用是将一个任务切换到指定的线程中去执行,(准确的说是切换到构成handler的looper所在的线程中去出处理)android系统中的一个例子就是主线程中的所有操作都是通过主线程中的handler去处理的。

Handler的运行需要底层的 messagequeue和 looper做支撑。



5. Android消息队列浅析

 当面试官问到你消息对列的时候,恭喜你,已经跨过初级,在试探你的中级水平了。

Android的消息循环是参考Windows的消息循环机制来实现的。

消息队列4件套   Message、MessageQueue、Looper、Handler

1、Message 是消息对列的消息实体类,因为消息队列中会存放最多10个Message对象。常用属性 what,是消息体的Tag,用来区分是那个一消息体。

2、 MessageQueue  先进先出”的原则存放消息,将Message对象以链表的方式串联起来。

3、Looper 是MessageQueue的管理者,主线程中是一对一的关系。子线程需要用到消息对列的话就需要经典二人组 。先调用 Looper.prepare()方法,然后再调用Looper.loop();

4、Handler 是封装和处理Message对象的。

通过源码可知消息走向如下

handler.sendMessage()-->handler.sendMessageDelayed()-->handler.sendMessageAtTime()-->msg.target = this;queue.enqueueMessage==>把msg添加到消息队列中

阅读全文

与android消息队列模型相关的资料

热点内容
pythonjavascript对比 浏览:740
什么动漫app是大陆字幕 浏览:284
android查看activity栈 浏览:918
x86固件编译 浏览:164
安卓下什么可以看微博动图 浏览:412
永辉生活app注册有什么优惠吗 浏览:409
行偏移算法 浏览:240
什么app也能让wifi增强 浏览:178
双分录核算法反映什么 浏览:210
ubuntuphpaptget 浏览:256
安卓手机快充需要什么数据线 浏览:795
程序中存在未转换未编译部分 浏览:323
编译汇编链接优化 浏览:83
程序员打字和作家哪个打字快 浏览:579
安卓手机怎么用cad命令行 浏览:385
2200工程机接收命令瞬间消失 浏览:255
压缩机工艺管是多大的 浏览:314
安卓刷什么系统稳定 浏览:37
程序员写炫酷代码 浏览:933
大话存储pdf 浏览:526