预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共35页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

HYPERLINK"http://www.cnblogs.com/angeldevil/"AngelDevil HYPERLINK"http://www.angeldevil.me"\t"_blank"我的个人博客:angeldevil.me HYPERLINK"http://www.cnblogs.com/"博客园 HYPERLINK"http://www.cnblogs.com/angeldevil/"首页 HYPERLINK"http://i.cnblogs.com/EditPosts.aspx?opt=1"新随笔 HYPERLINK"http://msg.cnblogs.com/send/AngelDevil"联系 HYPERLINK"http://www.cnblogs.com/angeldevil/rss"订阅 HYPERLINK"http://i.cnblogs.com/"管理 随笔-39文章-0评论-184 HYPERLINK"http://www.cnblogs.com/angeldevil/p/3340644.html"Android消息处理机制(Handler、Looper、MessageQueue与Message) Android是消息驱动的,实现消息驱动有几个要素: 消息的表示:Message 消息队列:MessageQueue 消息循环,用于循环取出消息进行处理:Looper 消息处理,消息循环从消息队列中取出消息后要对消息进行处理:Handler 平时我们最常使用的就是Message与Handler了,如果使用过HandlerThread或者自己实现类似HandlerThread的东西可能还会接触到Looper,而MessageQueue是Looper内部使用的,对于标准的SDK,我们是无法实例化并使用的(构造函数是包可见性)。 我们平时接触到的Looper、Message、Handler都是用JAVA实现的,Android做为基于Linux的系统,底层用C、C++实现的,而且还有NDK的存在,消息驱动的模型怎么可能只存在于JAVA层,实际上,在Native层存在与Java层对应的类如Looper、MessageQueue等。 初始化消息队列 首先来看一下如果一个线程想实现消息循环应该怎么做,以HandlerThread为例: publicvoidrun(){ mTid=Process.myTid(); Looper.prepare(); synchronized(this){ mLooper=Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid=-1; } 主要是红色标明的两句,首先调用prepare初始化MessageQueue与Looper,然后调用loop进入消息循环。先看一下Looper.prepare。 publicstaticvoidprepare(){ prepare(true); } privatestaticvoidprepare(booleanquitAllowed){ if(sThreadLocal.get()!=null){ thrownewRuntimeException("OnlyoneLoopermaybecreatedperthread"); } sThreadLocal.set(newLooper(quitAllowed)); } 重载函数,quitAllowed默认为true,从名字可以看出来就是消息循环是否可以退出,默认是可退出的,Main线程(UI线程)初始化消息循环时会调用prepareMainLooper,传进去的是false。使用了ThreadLocal,每个线程可以初始化一个Looper。 再来看一下Looper在初始化时都做了什么: privateLooper(booleanquitAllowed){ mQueue=newMessageQueue(quitAllowed); mRun=true; mThread=Thread.currentThread(); } MessageQueue(booleanquitAllowed){ mQuitAllowed=quitAllowed; nativeInit(); } 在Looper初始化时,新建了一个MessageQueue的对象保存了在成员mQueue中。MessageQueue的构造函数是包可见性,所以我们是无法直接使用的,在MessageQueue初始化的时候