微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 深入剖析Android消息机制

深入剖析Android消息机制

时间:03-28 来源:互联网 点击:

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的怀抱中。而绕的这一圈,也正好帮助我们将同步操作变成了异步操作。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top