Android消息机制-深入理解消息队列的工作模式

前言

队列:队列是一种简单的先进先出的数据结构。 在代码中, 对队列的操作应该加入同步机制,因为队列可以接受多个线程同时向队列发送消息。

Android消息机制中的成员

这里可以用一句话描述消息机制设计到的成员:消息发送者发送消息给队列传递到消息处理。

1.消息承载体(Message)

这个不用解释了,就是装消息的包。值得注意的是,Android消息机制中的消息倾向适合数据量比较小的场合。 

2.消息处理者(Handler  )

在队列的左侧,有一个消息的发送者,这个对象可以向消息队列发送装载消息的消息(有点饶)

在队列的右侧,有一个消息接收者,这个对象可以接收到来自队列的消息,并处理。

3.消息队列(MessageQueue)

在Android系统中,消息的队列最常用的数据结构是先进先出的列表,当然也可以自定义一种队列。

4.消息传递所在的线程(一个线程最多含有一个Looper)

一般来说,上述几个对象常用于同一个线程中。但是,在前言有提到,队列是线程不安全的,所以,就会出现不同线程同时向队列发送消息,为了避免这种情况,Android机制规定:一个消息队列只能对应一个线程发送和接收消息。相反,同一个线程可以向不同队列发送消息,同一个线程也可以接收来自不同消息队列的消息。消息队列  服务于创建它的线程,而它的宿主线程可以创建多个消息队列。

5.消息的等待-唤醒机制

这里有必要区分一下,线程的等待-唤醒机制了。 这种机制在Android消息机制中并不适用,因为消息队列并没有包含这种等待-唤醒机制,它只负责对数据的传递。

那么,有同学会问:难道队列左侧的线程都都在不停的发送消息,右侧的线程都在不停的接收消息?那多浪费啊~~

答:这个同学问得好!(我自言自语)没错,如果队列的两端都在不停的while循环执行,没有消息的时候也不停歇的话,不仅浪费资源也消耗性能。这个问题Google工程师早就想到并且为您解决了这个疑虑。

在Android中,Google工程师另外开辟了一条类似于管道(C++语言编写),这条管道叫做epoll机制,这条管道说白了就是一个消息控制器,来实时监视数据的文件描述符,当没有数据到来时,队列两端的线程都在睡眠状态,当管道接收到数据时,数据发送线程就会被唤醒,此时数据接收线程还在睡眠状态,但在被管道在写端写入一个字符时候,数据接收线程这时候就被唤醒了。起床接收数据了,这时候数据发送线程在一定时间没有数据到来的话,就切换到睡眠状态。 就这样,消息队列完美的完成了数据的传递。

 


你可能感兴趣的:(Android技术集锦)