Android面试题目之六---Handler,Looper和MessageQueue深入研究

[size=x-large]1.Handler, MessageQueue, Looper 之间的关系图。[/size]

a. Looper相当于一个引擎,从队列中获取消息,然后发送给Handler.
b. Handler不但能接收消息,还能发送消息。也就是说它是一个消息收发器,同时还可 以查询和移除消息。
c. MessageQueue是一个消息队列,提供阻塞的next方法,next阻塞一直到退出或者发现另外一个消息。

[size=x-large]从消息传递层面上讲,消息从handler出发,进入到mesageQueue里面,然后Looper从messageQueue里面取出,发送给handler。下图显示的消息的传递路线,这就叫做异步消息机制。[/size]


[img]http://dl2.iteye.com/upload/attachment/0126/5045/193ed99e-ea53-3fa3-af76-582034096a3b.png[/img]



[size=x-large]从依赖关系来讲,MessageQueue对handler没有直接依赖关系, MessageQuueue对Looper没有任何依赖。下图绘制了依赖关系。比较强的依赖关系就是Handler和Looper都依赖于MessageQueue。看来MessaegQueue才是整个机制的核心。[/size]


[img]http://dl2.iteye.com/upload/attachment/0126/5047/faf80d7f-399a-3324-80d1-551c5dcb9280.png[/img]

[size=x-large]
从另外一个设计层面上讲,多线程编程中有一个生产者和消费者模式。[/size]

[img]http://dl2.iteye.com/upload/attachment/0126/5049/d4d0455a-f352-37e3-8fd4-c7ad9d931874.png[/img]


[size=x-large][b]下面具体分析各个类[/b][/size]
[size=large]2. 首先要看接口Handler(消息生产者和消费者)[/size]
a. 创建
obtainMessage
b. 发送
post
postAtTime
postDelayed
postAtFrontOfQueue
sendMessage
sendEmptyMessage
sendEmptyMessageDelayed
sendEmptyMessageAtTime
sendMessageDelayed
sendMessageAtTime
sendMessageAtFrontOfQueue
runWithScissors
c. 删除
removeCallbacks
removeMessages
removeCallbacksAndMessages

d. 查询
hasMessages
hasCallbacks
e. 接受消息
handleMessage
dispatchMessage
可以看到handler 除了消息的收发,还可以查询和取消。

[size=large]3. 再看接口MessageQueue(消息存储者)[/size]
a. Idle处理
isIdle
addIdleHandler
removeIdleHandler

b.polling 查询。实际上是linux中的poll 或这epoll。意思是说正在等待消息。
isPolling

c.下面这两个是对文件描述符的监听。对应的是linux中poll或者epoll 中的文件描述符。具体需要查看linux 文档。
addOnFileDescriptorEventListener
removeOnFileDescriptorEventListener

d.下面这个是加入一个屏障,阻碍当前所有的消息处理,直到这个屏障被移除。
postSyncBarrier
removeSyncBarrier

e. 下面是一些受保护的方法。

这个是一个阻塞的方法,一直等待直到找到一个消息或者退出。
Next

这是一个退出next的方法。
quit

下面几个是消息队列常见的几个接口。增删查接口。
enqueueMessage
hasMessages
removeMessages
removeCallbacksAndMessages

[size=large]4. 最后看Looper,也就是我们的消息消费者:[/size]
最关键的几个方法
prepare
loop
quit
quitSafely

还有几个查询的方法
getMainLooper
myLooper
myQueue
isCurrentThread
getThread
getQueue
[color=red][size=large]综上可以看出一些端倪,handler这整套机制都是围绕消息的,那么为什么使用消息队列呢?
消息队列是一种多线程的设计模式。

一个模块接收另外一个模块的调用。这种调用可能会很多:

* 一个API被调用时, 被调用者因为资源(线程资源,内存资源等)的有限性,其执行速度可能跟不上调用者的紧急要求,因此使调用者阻塞。 而消息队列就可以防止这种阻塞。

调用者可能的紧急要求有:

1. 调用者对单次的执行时间非常敏感,例如UI线程, 或者正在接收IO请求,用户的输入或者网络输入等。
2. 调用者在执行一些更加紧急任务的时候,例如扫描病毒等。

* 另一方面,我们又希望这些请求能够被处理。
这个时候我们就可以把请求缓存起来,而消息队列就是这样一种缓存机制。[/size]
[/color]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值