Handler工作原理

来源:互联网 发布:autocad2015注册机mac 编辑:程序博客网 时间:2024/06/07 17:59

Application主线程即ActivityThread类,从入口static main函数开始,调用Looper的prepareMainLoopr(),在被调用的prepare方法中,实例化Looper对象,同时在Looper的构造方法中,创建了MessageQueue(消息队列)。
接着,UI主线程调用Looper的looper(),looper()会让当前线程进入一个无限循环,不断地从MessageQueue中读取消息(Message),queue.next()会对阻塞消息,然后回调msg.target.dispatchMessage(msg)方法处理消息,msg.target实际上会处理消息。
➔Looper与主线程和MessageQueue建立了联系。
在Handler构造方法中,通过Looper.myLooper获取当前线程保存的Looper实例,通过Looper对象得到MessageQueue,即Handler中持有MessageQueue对象。
➔Handler与MessageQueue建立了联系。
再看Handler的sendMessage(msg)方法一直向下查找,在enqueueMessage()中,msg.target = this,将handler作为msg.target的属性,最终调用queue.enqueueMessage(msg),将消息发送给MessageQueue。
➔MessageQueue本质就是一个链表,保存着等待被Looper执行的各种消息,而它的消息是由Handler添加进去的。
回到上边看dispathMessage方法,内部调用handlerMessage(msg),而其方法为空,为什么呢,因为消息的最终回调是由我们控制的,我们在创建handler的时候都是复写handleMessage方法,然后根据msg.what进行消息处理。

原创粉丝点击