一般用法:
* class LooperThread extends Thread {
* public Handler mHandler;
*
* public void run() {
* Looper.prepare();
*
* mHandler = new Handler() {
* public void handleMessage(Message msg) {
* // process incoming messages here
* }
* };
*
* Looper.loop();
* }
* }
1.Looper:
主消息循环
调用prepare()------>sThreadLocal.set(new Looper())------>new Looper()------->mQueue = new MessageQueue()
负责建立消息队列,并将一个Looper对象加入到线程局部对象中。
loop(),while(true)遍历mQueue,调用 msg.target.dispatchMessage(msg)------>Handler的handlerMessage
quit(),发送一个target=null的message
2.MessageQueue:
Looper的消息队列,单链表
3.Handler:
处理消息,构造时,Looper.myLooper()获取当前线程的Looper对象,并设置mQueue为该Looper的mQueue,即把自己绑定到一个Looper上,必须把Handler绑定到Looper上;
sendMessage时,设置Message.target=this,然后添加到mQueue中
4.Message:
每个Message由一个Handler来处理,target参数
附:在Activity,Service中之所以不需要调用Looper.prepare,和Looper.loop,就可以直接构造Handler,是因为在UI主线程建立时(ActivityThread.java),已经调用了prepare和loop,这些Handler都是绑定在UI线程上,所以不要在Handle中做耗时操作,否则会阻塞UI,导致ANR。
本文详细解析了Android中的Looper机制,包括Looper、MessageQueue、Handler及Message的运作原理。介绍了如何通过Looper建立消息队列并处理消息,同时强调了在UI线程中使用Handler时避免耗时操作的重要性。
3347

被折叠的 条评论
为什么被折叠?



