关于Android的消息队列(翻译by Hendy)

合集下载

消息队列的工作原理

消息队列的工作原理

消息队列的工作原理消息队列(Message Queue),简称MQ,是一种在分布式系统中应用广泛的通信模型,用于实现异步通信和解耦系统组件之间的关系。

它能够将消息发送方和接收方解耦,并能够提供高度可靠的消息传输机制。

在现代应用开发中,消息队列已成为构建可扩展性和弹性的重要组件之一首先,消息生产者将消息发送到消息队列中,称为将消息入队。

消息队列将消息保存在其中,直到消息被消费者接收和处理。

消息传输是消息队列的核心过程。

消息传输包括两个阶段:将消息从生产者发送到消息队列,和将消息从消息队列发送到消费者。

消息生产者发送消息到消息队列时,可以采用两种方式:发到消息队列的内存中或者写入到磁盘文件中。

这两种方式有各自的优缺点。

如果消息先写入到内存中,速度很快,但是一旦消息队列宕机,消息会丢失。

为了解决这个问题,可以将消息持久化到磁盘文件中。

这种方式可以确保消息的持久性和可靠性,但是会引入磁盘IO开销,降低性能。

当消息到达消息队列后,它会根据一定的策略进行存储和管理。

消息队列通常采用队列(FIFO)的方式进行消息管理。

先发送的消息先被消费,保证消息的顺序性。

消费者在实际处理阶段消费消息。

消费者在注册消息队列时,可以选择两种方式接收消息:主动拉取和被动推送。

主动拉取方式,消费者需要主动地从消息队列中拉取消息,然后进行处理。

这种方式对于消费者来说更加灵活,可以按照自身的处理速度去拉取消息,但需要不断地发送拉取请求,可能会造成额外的网络开销。

被动推送方式,消息队列主动将消息推送给消费者。

消费者在注册时提供一个接收消息的地址,当有消息到达时,消息队列会将消息推送给消费者。

这种方式对于业务量大、实时性要求高的场景更加合适,消费者无需频繁发送拉取请求。

在处理消息过程中,消息队列还提供了一些重要的机制,例如消息持久化、事务消息和消息确认机制。

消息持久化指在消息到达消息队列后,将消息持久化到磁盘文件中。

这样即使消息队列宕机,消息也不会丢失。

android开发hander机制详细介绍

android开发hander机制详细介绍

Android Looper和HandlerMessage:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。

Handler:处理者,负责Message的发送及处理。

使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。

MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO 规则执行。

当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。

Looper:消息泵,不断地从MessageQueue中抽取Message执行。

因此,一个MessageQueue需要一个Looper。

Thread:线程,负责调度整个消息循环,即消息循环的执行场所。

Android 系统的消息队列和消息循环都是针对具体线程的,一个线程可以存在(当然也可以不存在)一个消息队列和一个消息循环(Looper),特定线程的消息只能分发给本线程,不能进行跨线程,跨进程通讯。

但是创建的工作线程默认是没有消息循环和消息队列的,如果想让该线程具有消息队列和消息循环,需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。

如下例所示: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();//使消息循环起作用,从消息队列里取消息,处理消息}}注:写在Looper.loop()之后的代码不会被立即执行,当调用后mHandler.getLooper().quit()后,loop才会中止,其后的代码才能得以运行。

消息队列介绍及原理

消息队列介绍及原理

消息队列介绍及原理消息队列(Message Queue)是一种进程间通信的方式,通过消息的方式进行数据传输和交互。

它将消息按照一定的顺序存放在队列中,接收方可以按照一定的规则从队列中取出消息进行处理。

消息队列常用于分布式系统或异步处理的场景中,它能够实现异步解耦、削峰填谷、异步处理等功能。

同时,消息队列还具有高可用、可靠性强等特点,使得它成为了当前分布式系统中不可或缺的重要组件。

下面将介绍消息队列的原理及其基本特点。

一、消息队列的基本原理消息队列的基本原理可以归纳为三个关键组成部分:生产者、队列和消费者。

1. 生产者(Producer):消息的生产者负责将需要传递的消息发送到队列中。

生产者只负责把消息发送到队列,不需要知道消息被谁接收。

2. 队列(Queue):消息队列是消息传递的媒介,它负责存储所有发送过来的消息。

消息队列通常是基于先进先出(FIFO)原则进行消息的存储和处理。

3. 消费者(Consumer):消费者从队列中获取消息并进行处理。

消费者需要从消息队列中主动获取消息,因此消费者和队列之间是解耦的。

消息队列的基本原理可以表示为:生产者将消息发送到队列,消费者从队列中获取消息进行处理。

生产者和消费者之间通过消息队列实现了解耦,生产者和消费者之间并不直接通信。

二、消息队列的基本特点消息队列具有以下的基本特点,使得它成为了一种重要的分布式系统通信方式。

1.异步解耦:生产者和消费者之间通过消息队列进行通信,生产者发送消息后即可继续其他逻辑处理,而不需要等待消费者的处理结果。

这样能够实现异步解耦,提高系统的响应速度和吞吐量。

2.削峰填谷:队列作为中间媒介,能够将消息暂时存储起来。

当消费者无法及时处理消息时,消息可以在队列中排队等待处理。

这样能够避免突发流量对系统的影响,平滑处理请求,达到平均请求速率。

3.可靠性:消息队列通常具备持久化机制,可以确保消息不会丢失。

即使在生产者发送消息后,但在消费者接收消息之前,如果发生系统故障,消息也不会丢失。

Android学习之消息机制相关类介绍

Android学习之消息机制相关类介绍

Android学习之消息机制相关类介绍Android的消息机制是很重要的一个知识。

Message(消息):是消息队列中的组成单元。

里面包含了数据对象。

获得Message最好的方式是通过obtain()函数获取,有多个obtain()函数,只是传入参数不同,功能是一样的。

obtain()作用是从消息池中取出一个Message,节约资源。

如果没有则新建一个Message返回。

Runnable:和Java里的Runnable是有点区别的,Android API对它的解释是:代表一个可以被执行的命令。

Message Queue(消息队列):这是Android消息机制的基础,里面有很多的消息(Message)。

并且不同的消息有不同的优先级,消息在Android系统中使用MessageQueue的enqueueMessage(Message msg,Long when)来加入消息队列的,所以消息的优先级的区分是根据when来决定的。

Handler(管理者):负责Message的发送与接收。

Handler有两种方式发送消息:一种是postXXX() ,如:post(Runnable) ,postDelayed(Runnable,long)在Handler.postXXX(Runnable...)后,系统调用Handler.getPostMessage(Runnable)将Runnable 赋值给Message的callback属性。

最后将返回的Message加入消息队列。

源代码如下:Java代码1viewplaincopytoclipboardprint?2privatefinalMessagegetPostMessage(Runnabler){3Messagem=Message.obtain();4m.callback=r;5returnm;6}另一种是sendXXX(),如:sendMessage(Message),sendMessageDelayed(Message,long),Handler对消息的发送最终都是调用MessageQueue.enqueueMessage()这个方法将Message放入队列中的。

什么是消息队列

什么是消息队列

什么是消息队列?消息队列是一种在应用程序之间传递消息的通信模式。

它提供了一种异步的、解耦的方式来处理消息的发送和接收。

消息队列通常被用于解决分布式系统中的通信和数据交换问题。

以下是消息队列的一些关键概念和特性:1. 生产者和消费者:消息队列中的消息生产者负责发送消息到队列,而消息消费者则负责从队列中接收和处理消息。

生产者和消费者可以是独立的应用程序,它们通过消息队列实现解耦和异步通信。

2. 消息:消息是生产者发送到消息队列的数据单元。

它可以是任意格式的数据,如文本、JSON、XML等。

消息通常包含一些元数据,如标识符、时间戳等,以帮助消费者处理和识别消息。

3. 队列:队列是消息的存储和传递机制。

它可以是内存中的数据结构或持久化存储。

消息队列通常支持先进先出(FIFO)的消息传递顺序,确保消息按照发送的顺序进行处理。

4. 可靠性:消息队列通常提供可靠性保证,确保消息的可靠传递和处理。

它可以通过持久化消息和确认机制来确保消息不会丢失或重复处理。

消息队列还可以提供消息的持久化存储,以防止系统故障导致消息丢失。

5. 异步通信:消息队列采用异步通信模式,生产者和消费者可以独立地进行操作,不需要直接的即时响应。

这种异步模式可以提高系统的可伸缩性和性能,允许生产者和消费者在不同的速率下运行。

6. 解耦和削峰:消息队列可以实现系统组件之间的解耦,使得系统更加灵活和可维护。

通过将消息发送到队列中,生产者和消费者可以独立地演化和扩展,而不会相互影响。

此外,消息队列还可以用于削峰填谷,即在高峰期缓冲请求,以平稳处理流量。

7. 多模式通信:消息队列通常支持多种通信模式,如点对点(Point-to-Point)和发布/订阅(Publish/Subscribe)。

点对点模式中,消息从一个生产者发送到一个特定的消费者;而发布/订阅模式中,消息被广播到多个订阅者。

消息队列在许多应用场景中得到广泛应用,特别是在分布式系统和微服务架构中。

消息队列的使用方法

消息队列的使用方法

消息队列的使用方法消息队列是一种用于在不同的系统和应用程序之间传递和传输数据的中间件。

它使用先入先出(FIFO)的方式存储和分发消息,可以提高系统的可靠性、扩展性和性能。

在实际应用中,消息队列有着广泛的使用场景,包括异步处理、解耦系统组件、削峰填谷、流量控制以及实现可靠的消息传递等。

下面将详细介绍消息队列的使用方法。

1.选择消息队列在开始使用消息队列之前,需要根据实际需求选择适合的消息队列。

常见的消息队列有Kafka、RabbitMQ和ActiveMQ等。

选择时,需要考虑消息的延迟要求、系统的可用性、消息吞吐量等因素。

2.定义消息格式在使用消息队列之前,需要定义消息的格式。

消息的格式应该简洁清晰,包含必要的信息,并考虑消息的扩展性和兼容性。

可以使用JSON、XML或者自定义的消息格式。

3.创建消息生产者消息生产者负责生成和发送消息到消息队列。

在创建消息生产者时,需要指定消息队列的地址和端口,并进行身份验证(如果需要)。

然后,通过消息队列提供的API,将消息发送到指定的队列中。

4.创建消息消费者消息消费者用于接收处理消息队列中的消息。

消费者需要连接到消息队列,并订阅一个或多个队列。

通过注册回调函数,消费者可以在消息到达时对消息进行处理。

5.异步处理消息一般情况下,消息队列的主要优势在于它可以实现异步处理。

消息生产者发送消息之后,可以立即返回,而不需要等待消息被消费者处理。

这种异步处理方式可以提高系统的性能和吞吐量。

6.解耦系统组件消息队列可以将系统中的各个组件解耦,使得它们可以独立运行和扩展。

消息生产者和消费者不需要直接知道对方的存在,它们只需要连接到消息队列即可。

7.削峰填谷消息队列可以用于平滑处理系统中的峰值流量。

当流量高峰到来时,消息队列可以暂时保存消息,等到系统负载下降时再进行消费。

这样可以避免系统因流量突增而崩溃。

8.流量控制通过设置合适的缓冲区大小和消费速率,消息队列可以实现流量控制。

消息队列的原理

消息队列的原理

消息队列的原理
消息队列是一种在应用程序之间实现异步通信的机制。

它是基于生产者-消费者模式的,即一个或多个生产者将消息放入队
列中,一个或多个消费者从队列中获取消息进行处理。

消息队列的原理如下:
1. 生产者发送消息:生产者将消息发送到消息队列中。

消息可以是任何形式的数据,如文本、图像、音频等。

2. 消息队列存储消息:消息队列是一个存储消息的缓冲区,它可以按照先进先出(FIFO)的顺序存储消息。

消息队列一般
基于内存或者持久化存储。

3. 消费者获取消息:消费者可以在任何时候从消息队列中获取消息。

消费者可以单个或批量获取消息,具体取决于实现方式。

4. 消费者处理消息:消费者获取到消息后,将对消息进行处理。

处理方式可以是执行特定的业务逻辑、将消息写入数据库、发送到其他系统等。

5. 消息确认和删除:消费者在处理完消息后,可以向消息队列发送确认消息,告知消息队列该消息已经成功处理。

消息队列接收到确认消息后,将删除该消息。

6. 处理失败的消息:如果消费者在处理消息时发生错误,可以进行相应的错误处理,例如记录日志、重试处理、发送到死信队列等。

消息队列的好处包括解耦、削峰填谷、提高系统可伸缩性、提高系统可靠性等。

它常用于处理高并发、异步处理、系统解耦等场景。

Android消息机制Handler用法总结

Android消息机制Handler用法总结

Android消息机制Handler⽤法总结1.简述Handler消息机制主要包括: MessageQueue、 Handler、 Looper、Message。

Message:需要传递的消息,可以传递数据;MessageQueue:消息队列,但是它的内部实现并不是⽤的队列,⽽是通过单链表的数据结构来维护消息列表,因为单链表在插⼊和删除上⽐较有优势。

主要功能是向消息池投递消息( MessageQueue.enqueueMessage)和取⾛消息池的消息( MessageQueue.next)。

Handler:消息辅助类,主要功能是向消息池发送各种消息事件( Handler.sendMessage)和处理相应消息事件(Handler.handleMessage);Looper:消息控制器,不断循环执⾏( Looper.loop),从MessageQueue中读取消息,按分发机制将消息分发给⽬标处理者。

2.异步线程切换原理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();}}每⼀个异步线程,都维护着唯⼀的⼀个Looper,每⼀个Looper会初始化(维护)⼀个MessageQueue,之后进⼊⼀个⽆限循环⼀直在读取MessageQueue中存储的消息,如果没有消息那就⼀直阻塞等待。

我们在实例化handler的过程中,会先得到当前所在线程的looper对象,之后得到与该looper对象相对应的消息队列,看源码Handler中持有Looper、MessageQueue。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

谈谈Android的消息队列
[由Steve Guo撰写,如果转发,请保留本注释]
Android没有像windows那样实现全局的消息队列用于跨进程通信(Hendy注:这里的消息队列是指java层的或者UI层的,不是linux底层的消息队列,至于Android底层支不支持消息队列,暂无考证)。

实际上,如果你需要跨进程通信,Android官方的做法是使用intent。

Android只支持进程内的消息通信。

我怀疑在将来Android可能会支持跨进程的消息。

因为你可以在Messager.java及Handler.java 中看到IMessager的代码片断。

但是目前你从IBinder代理对象中是取不到IMessager的实例的。

Looper.java是用来在一个线程中运转消息队列的类。

在缺省情况下,线程是没有消息队列的,需要自己创建消息队列。

下面的代码演示了在LooperThead中使用Handler与Looper进行通信。

一个线程只能有一个Looper实例。

// Example 1:
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();
}
}
当你的java应用进程被创建的时候,它的主线程会创建一个消息队列来管理上层的应用对象(比如activity、intent receiver等)及它们所创建的所有窗口。

因此,你不需要自己在主线程里创建一个Looper对象。

下面的代码是ActivityThread.java中的一小段,其中为主线程创建了Looper对象。

public static final void main(String[] args) {
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false);
Looper.loop();
if (Process.supportsProcesses()) {
throw new RuntimeException("Main thread loop unexpectedly exited");
}
thread.detach();
}
Handler.java允许你发送及处理与线程消息队列相关的消息及Runnable对象。

每个Handler 实例都与单个线程相关联。

当你创建一个Handler时,从创建的地方开始,这个Handler就与创建它的线程绑定在线起了。

它就可以发送消息及Runnable对象到线程的消息队列了,也可以处理这些从消息队列中取出来的消息及Runnable对象。

Handler中发送消息的API可以分为两种:send和post。

Send可以将一个包含一批数据的消息对象加入到消息队列,这个消息对象将被Handler.handleMessage方法处理(你需要在Handler的子类中实现这个方法)。

你可以参看上面的Example1中的例子。

Post方式允许你将一个runnable对象加入到消息队列。

当消息队列接收到一个runnable对象时,这个runnable 对象的run方法将会被调用。

下面是一个示例:
// Example 2:
class MyActivity extends Activity {
Handler mHandler = new Handler();
public void XXX() {
// post a runnable object to run on main message queue
mHandler.post(new Runnable() {
public void run() {
// now it’s run on the thread corresponding to mHandler.
}
});
}
}。

相关文档
最新文档