您的位置:首页 > 产品设计 > UI/UE

彻底搞定Looper,Handler,Message,MessageQueue,和Thread之间的关系

2013-10-12 09:57 441 查看
Looper,英文意思环形,也就是无限循环,这样想就对了。Looper有两个非常重要的方法,Looper.prepare和Looper.loop(),它们是干嘛的呢?首先:

Looper.prepare():瞧了瞧源代码,原来是这样,就执行了sThreadLocal.set(new Looper(quitAllowed));这样一句。这个是干嘛呢,又去瞧了瞧sThreadLocal是什么东西,搞来搞去大概就是这个意思:一个线程对应一个Looper,类似于通过键值对的方式保存在一个不为人知的地方(自己去看啦,不但可以存Looper,还可以存好多好多东西呢),所以通过looper可以获知宿主线程,通过线程也可以知道对应的Looper,而上面那条语句就是做了这样的一个事情,让他们两个之间建立非常亲密的一一对应的关系。简单的说prepare()的作用就是new了一个looper,然后把它嫁给了当前所在的线程,永远不分开了。

Looper.loop():这个方法和上面那个方式是一起用的,也是非常的亲密。它是干嘛的呢,瞧了瞧源代码,一堆代码原来就做了这样一件狗屁简单的事,loop自己有一个messageQueue变量,这个变量的意思就是消息队列,所以它装的尽是些Message,loop()就无限循环不要命的去翻这个messageQueue里面的Message,已经发现Message,就把它给办了,怎么办了,这样一条语句给办了 msg.target.dispatchMessage(msg);它这是干嘛啊,它的意思就是叫message的老婆handler(target)把它给办了,在dispatch里面呢,先会执行msg或者handler的回调借口callback,不空的话就执行这个就可以了,不去执行handleMessage()。如果为空的话,就是我们平常用的情况,执行handler的handleMessage把这个msg给办了。简单的说,loop就是启动循环,处理这个线程的looper的消息队列里的消息。

Handler ,表面意思就是处理者,它就是消息的最终处理者。扒了handler的衣服,嘿嘿看看好不好看啊?一看吓一跳,也不过如此。

handler构造的时候,神不知鬼不觉地就去获取当前线程的looper,原来handler也是它的唯一(一一对应)。会出现 "Can't create handler inside thread that has not called Looper.prepare()");这个异常的原因,就是因为handler找不到它亲爱的looper了,要知道,一个线程被创建,必须手动looper.prepare()去创建这个线程的looper。那你会说activity里面创建怎么就不会了,很明显啦,activity对应的是一个特殊线程ActivityThread,系统已经执行了looper.prepareMainLooper了还有Looper.loop()了。明白这个异常的原因了吧,所以在一个自建的线程Thread里,如果有new
Handler()这样的语句,必须在前面增加Looper.prepare()来给这个thread生成一个looper,当然在最后也别忘了执行Looper.loop()。



Handler.sendMessage 不要以为他把消息发给别个谁了,其实他就是把消息Message插到自己的messageQueue里了,所以记着了,sendMessage就是插入消息到队列中。还有很多“乱七八糟”的发送方法,无法就是啥时候插入到消息队列当中去嘛。

Handler.handleMessage 空方法,必须要自己实现。

Handler.dispatchMessage:asdf 分发消息,我是觉得没必要理解成是分发消息的意思,就是处理消息的意思。和上面什么区别,这个处理时先看看message或者handler的callback回调接口是否空的,不空就执行。前面i两个加上handleMessage,只会执行其中一个,先后次序就是这里的文字先后顺序。

Message:本身就是一个链表,比较重要的地方就是只要Message有实现callback或者handler里面有实现callback的话,handler去handleMessage处理消息的时候就会先执行message的callback或者先执行handler的callback。

还有一个比较重要的:它里面有一个静态变量sPool也是message类型它是一个message池,存储着闲置的message,所有新建消息的方法都是从这个池子里获取的。

MessageQueue:别被表象迷惑了,它本身不是链表了,实际上还是message来存储Message。MessageQueue里里面有一个Message类型成员变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐