线程中Handler和Looper的理解

来源:互联网 发布:奶油知多少 编辑:程序博客网 时间:2024/05/25 05:37

网上没有什么比较好的例子,往往给出的都是这样的代码

 LooperThread Thread {    Handler mHandler;    run() {     Looper.prepare();     mHandler = Handler() {        handleMessage(Message msg) {                }     };     Looper.loop();   } }


然后在一开始就对这个线程的实例调用start(),当需要其处理数据时,往这个线程中的mHandler发送message即可。

就这么看的话,确实不是很理解,网上的解释是给出源码一条一条解释给你看。可是要真正理解还是要自己去看一看源码,然后自己写个demo试试。

通过代码可以知道,Looper作为一个消息泵,在主线程中已经默认设置好了。如果在其他线程也想实行类似的消息处理机制,就要像上面的例子一样继承Thread重写,同时,一个线程只能有一个Looper,对应一个MessageQueue。

而只所以其中可以进行循环不断地消息处理,是因为在Looper.loop()里,实行了一个for( ; ; )的无限循环,而在这个循环里的判断,通过看源码得知,Looper中自己维护的MessageQueue中的next()方法中也有一个for( ; ; )循环,在其中,只要不收到quit的消息,就不会跳出循环给出返回值,这样loop()就会一直在等到有消息进来。所以在退出该线程时需要调用到Looper的quit()方法。

这里的looper的quit也有区别,分别是quit()和quitSafely()方法,区别就是前者直接退出,清空queue中的所有信息,后者会将还在MessageQueue中的非延迟信息处理了,然后清空所有延迟信息(delayed),然后再退出。


0 0
原创粉丝点击