Android源码分析-消息队列和Looper.pdf
文本预览下载声明
ssiinnggwwhhaattiiwwaannnnaa的的专专栏栏
关关注注aannddrrooiidd、、hhttmmll55等等移移动动互互联联网网技技术术
[[置置 ]] AAnnddrrooiidd源源码码分分析析--消消息息队队列列和和LLooooppeerr
分类: android开发 2013-12-17 00:15 1409人阅读 评论 (7) 收藏 举报
android消息队列Looper线程IntentService
转载请注明出处:/singwhatiwanna/article/details
前前言言
上周对Android中的事件派发机制进行了分析,这次博主要对消息队列和Looper的源码进行简单的分析。大家耐心看
下去,其实消息队列的逻辑比事件派发机制简单多了,所以大家肯定会很容易看懂的。
概概念念
11.. 什什么么是是消消息息队队列列
消息队列在android中对应MessageQueue这个类,顾名思义,消息队列中存放了大量的消息 (Message)
22..什什么么是是消消息息
消息 (Message)代表一个行为 (what)或者一串动作 (Runnable),有两处会用到Message:Handler和Messenger
33..什什么么是是HHaannddlleerr和和MMeesssseennggeerr
Handler大家都知道,主要用来在线程中发消息通知ui线程更新ui。Messenger可以翻译为信使,可以实现进程间通
信 (IPC),Messenger采用一个单线程来处理所有的消息,而且进程间的通信都是通过发消息来完成的,感觉不能
像AIDL那样直接调用对方的接口方法 (具体有待考证),这是其和AIDL的主要区别,也就是说Messenger无法处理多
线程,所有的调用都是在一个线程中串行执行的。Messenger的典型代码是这样的:new
Messenger (service).send(msg),它的本质还是调用了Handler的sendMessage方法
44..什什么么是是LLooooppeerr
Looper是循环的意思,它负责从消息队列中循环的取出消息然后把消息交给 目标处理
55..线线程程有有没没有有LLooooppeerr有有什什么么区区别别??
线程如果没有Looper,就没有消息队列,就无法处理消息,线程内部就无法使用Handler。这就是为什么在子线程内
部创建Handler会报错:Cant create handler inside thread that has not called Looper.prepare(),具体
原因下面再分析。
66..如如何何让让线线程程有有LLooooppeerr从从而而正正常常使使用用HHaannddlleerr??
在线程的run方法中加入如下两句:
Looper.prepare();
Looper.loop ();
这一切不用我们来做,有现成的,HandlerThread就是带有Looper的线程。
想用线程的Looper来创建Handler,很简单,Handler handler = new Handler (thread.getLooper ()),有了上面这
几步,你就可以在子线程中创建Handler了,好吧,其实android早就为我们想到这一点了,也不用自己
写,IntentService把我们该做的都做了,我们只要用就好了,具体怎么用后面再说。
消消息息队队列列和和LLooooppeerr的的工工作作机机制制
一个Handler会有一个Looper,一个Looper会有一个消息队列,Looper的作用就是循环的遍历消息队列,如果有新消
息,就把新消息交给它的目标处理。每当我们用Handler来发送消息,消息就会被放入消息队列中,然后Looper就会
取出消息发送给它的目标target。一般情况,一个消息的target是发送这个消息的Handler,这么一来,Looper就会
把消息交给Handler处理,这个时候Handler的dispatchMessage方法就会被调用,一般情况最终会调用Handler的
handleMessage来处理消息,用handleMessage来处理消息是我们常用的方式。
1
源码分析
11.. HHaannddlle
显示全部