深入剖析Android消息机制(2)

下面我们分析下程序的运行过程:

1.onCreate()

首先启动服务时将会调用onCreate()方法,在该方法中我们new了一个HandlerThread对象,提供了线程的名字和优先级。

紧接着我们调用了start()方法,执行该方法将会调用HandlerThread对象的run()方法:

public void run() {            mTid = Process.myTid();            Looper.prepare();            synchronized (this) {                mLooper = Looper.myLooper();                notifyAll();            }            Process.setThreadPriority(mPriority);            onLooperPrepared();            Looper.loop();            mTid = -1;        }  

在run()方法中,系统给线程添加的Looper,同时调用了Looper的loop()方法:

public static final void loop() {               Looper me = myLooper();            MessageQueue queue = me.mQueue;            while (true) {                Message msg = queue.next(); // might block                //if (!me.mRun) {                //    break;                //}                if (msg != null) {                    if (msg.target == null) {                        // No target is a magic identifier for the quit message.                        return;                    }                    if (me.mLogging!= null) me.mLogging.println(                            ">>>>> Dispatching to " + msg.target + " "                           + msg.callback + ": " + msg.what                            );                    msg.target.dispatchMessage(msg);                    if (me.mLogging!= null) me.mLogging.println(                            "<<<<< Finished to    " + msg.target + " "                           + msg.callback);                    msg.recycle();                }            }        }  

通过源码我们可以看到loop()方法是个死循环,将会不停的从MessageQueue对象中获取Message对象,如果MessageQueue 对象中不存在Message对象,则结束本次循环,然后继续循环;如果存在Message对象,则执行 msg.target.dispatchMessage(msg),但是这个msg的.target字段的值是什么呢?我们先暂时停止跟踪源码,返回到onCreate()方法中。线程执行完start()方法后,我们可以获取线程的Looper对象,然后new一个ServiceHandler对象,我们把Looper对象传到ServiceHandler构造函数中将使handler、looper和messageQueue三者建立联系。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwxzws.html