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

前言

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

Android消息机制中的成员

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

1.消息承载体(Message)

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

2.消息处理者(Handler  )

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

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

3.消息队列(MessageQueue)

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

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

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

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

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

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

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

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

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值