设为首页 加入收藏

TOP

Android主线程的消息系统(Handler\Looper)(三)
2015-07-16 12:55:09 来源: 作者: 【 】 浏览:4
Tags:Android 线程 消息 系统 HandlerLooper
t = this;//注意这行代码后面会用,把Handler赋值给Msg的target对象
? ? ? ? ? ? sent = queue.enqueueMessage(msg, uptimeMillis);//把msg放到MsgQueue中
? ? ? ? }
? ? ? ? else {
? ? ? ? ? ? RuntimeException e = new RuntimeException(
? ? ? ? ? ? ? ? this + " sendMessageAtTime() called with no mQueue");
? ? ? ? ? ? Log.w("Looper", e.getMessage(), e);
? ? ? ? }
? ? ? ? return sent;
? ? }


上面的方法第二个是延时毫秒数,queue.enqueueMessage把消息发送到MessageQueue后剩下的就是等待消息被处理,前面不是说了Looper.loop()方法开始轮询消息队列吗,你发送的消息就是在loop方法中读取到的,读取到后谁去处理呢?在loop()方法中有一句代码:


msg.target.dispatchMessage(msg);


msg就是你发送到MessageQueue的消息,被读取后调用target.dispatchMessage(),这个target就是上面Handler发送消息是赋值的,就是发送消息的Handler本身,然后Handler调用自己的下面方法就行消息处理:


?/**
? ? * Handle system messages here.
? ? */
? ? public void dispatchMessage(Message msg) {
? ? ? ? if (msg.callback != null) {
? ? ? ? ? ? handleCallback(msg);
? ? ? ? } else {
? ? ? ? ? ? if (mCallback != null) {
? ? ? ? ? ? ? ? if (mCallback.handleMessage(msg)) {
? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? handleMessage(msg);//在这会调用到上面重写的handleMessage方法。
? ? ? ? }
? ? }


因为在new Message的时候callback为空,并且Handler的mCallback = null,所以会调用到你上面new Handler时重写的handleMessage方法。


总结:


每一个线程中都对应一个Looper,每一个Looper都对应一个MessageQueue,这个Looper是用来管理消息队列的,主要是读取消息队列和把消息发送给Message的target去处理。到这你应该清除Thread、Handler、Message、MessageQueue和Looper他们之间的关系了吧。


首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android内存优化之磁盘缓存 下一篇seL4的编译和运行

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: