[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]
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]