深入剖析Android消息机制
is)方法,在该方法中我们要注意该句代码msg.target = this,msg的target指向了this,而this就是ServiceHandler对象,因此msg的target字段指向了 ServiceHandler对象,同时该方法又调用MessageQueue 的enqueueMessage(msg, uptimeMillis)方法: view plaincopy to clipboardprint? # final boolean enqueueMessage(Message msg, long when) { # if (msg.when != 0) { # throw new AndroidRuntimeException(msg # + “ This message is already in use.”); # } # if (msg.target == null !mQuitAllowed) { # throw new RuntimeException(“Main thread not allowed to quit”); # } # synchronized (this) { # if (mQuiting) { # RuntimeException e = new RuntimeException( # msg.target + “ sending message to a Handler on a dead thread”); # Log.w(“MessageQueue”, e.getMessage(), e); # return false; # } else if (msg.target == null) { # mQuiting = true; # } # msg.when = when; # //Log.d(“MessageQueue”, “Enqueing: ” + msg); # Message p = mMessages; # if (p == null || when == 0 || when p.when) { # msg.next = p; # mMessages = msg; # this.notify(); # } else { # Message prev = null; # while (p != null p.when = when) { # prev = p; # p = p.next; # } # msg.next = prev.next; # prev.next = msg; # this.notify(); # } # } # return true; # } 该方法主要的任务就是把Message对象的添加到MessageQueue中(数据结构最基础的东西,自己画图理解下)。 handler.sendMessage()-->handler.sendMessageDelayed()-->handler.sendMessageAtTime()-->msg.target = this;queue.enqueueMessage==>把msg添加到消息队列中 3.handleMessage(msg) onStartCommand()执行完毕后我们的Service中的方法就执行完毕了,那么handleMessage()是怎么调用的呢?在前 面分析的loop()方法中,我们当时不知道msg的target字段代码什么,通过上面分析现在我们知道它代表ServiceHandler对 象,msg.target.dispatchMessage(msg);则表示执行ServiceHandler对象中的 dispatchMessage()方法: view plaincopy to clipboardprint? 1. public void dispatchMessage(Message msg) { 2. if (msg.callback != null) { 3. handleCallback(msg); 4. } else { 5. if (mCallback != null) { 6. if (mCallback.handleMessage(msg)) { 7. return; 8. } 9. } 10. handleMessage(msg); 11. } 12. } 该方法首先判断callback是否为空,我们跟踪的过程中未见给其赋值,因此callback字段为空,所以最终将会执行handleMessage()方法,也就是我们ServiceHandler类中复写的方法。在该方法将根据what字段的值判断执行哪段代码。 至此,我们看到,一个Message经由Handler的发送,MessageQueue的入队,Looper的抽取,又再一次地回到Handler的怀抱中。而绕的这一圈,也正好帮助我们将同步操作变成了异步操作。
- 深入剖析MFC中Windows消息处理机制(04-11)
- TMS320C54x系列DSP的中断机制(08-08)
- 记录仪实时多任务调度策略的研究(07-16)
- 基于Nios II自助点菜系统的μC/GUI应用(06-05)
- 变频器伺服电机的几种制动方法(12-12)
- STC11F04单片机制作的32灯摇摇棒(11-30)