网上没有什么比较好的例子,往往给出的都是这样的代码
LooperThread Thread {
Handler mHandler;
run() {
Looper.prepare();
mHandler = Handler() {
handleMessage(Message msg) {
}
};
Looper.loop();
}
}
就这么看的话,确实不是很理解,网上的解释是给出源码一条一条解释给你看。可是要真正理解还是要自己去看一看源码,然后自己写个demo试试。
通过代码可以知道,Looper作为一个消息泵,在主线程中已经默认设置好了。如果在其他线程也想实行类似的消息处理机制,就要像上面的例子一样继承Thread重写,同时,一个线程只能有一个Looper,对应一个MessageQueue。
而只所以其中可以进行循环不断地消息处理,是因为在Looper.loop()里,实行了一个for( ; ; )的无限循环,而在这个循环里的判断,通过看源码得知,Looper中自己维护的MessageQueue中的next()方法中也有一个for( ; ; )循环,在其中,只要不收到quit的消息,就不会跳出循环给出返回值,这样loop()就会一直在等到有消息进来。所以在退出该线程时需要调用到Looper的quit()方法。
这里的looper的quit也有区别,分别是quit()和quitSafely()方法,区别就是前者直接退出,清空queue中的所有信息,后者会将还在MessageQueue中的非延迟信息处理了,然后清空所有延迟信息(delayed),然后再退出。