安卓源码分析
ActivityThread
- 该类的main()函数,是在主线程执行的,在这里我们把他当做程序的入口
public static final void main(String[] args) {
...
Looper.prepareMainLooper();
Looper.loop();
...
}
- 可以看到在main 方法中调用了 两个方法
- Looper.prepareMainLooper(); 来初始化消息机制(后文称之为消息轮询器)
- Looper.loop(); 方法来开始轮询消息
Looper
- Looper.prepareMainLooper(); 我们看下这个方法它做了什么
private Looper() {
mQueue = new MessageQueue();
mRun = true;
mThread = Thread.currentThread();
}
public static final void prepareMainLooper() {
prepare();
...
}
public static final void prepare() {
...
sThreadLocal.set(new Looper());
}
- 我们看到,在这个方法中调用了prepare()方法, prepare()方法直接new Lopper(); 放在当前线程的ThreadLocal中. Looper的构造方法里面 new MessageQueue(); 创建了一个消息队列.
- 在prepareMainLooper()方法中, 创建了Looper 和 MessageQueue.
- Looper.loop();
- 我们看下这个方法做了什么呢
public static final void loop() {
Looper me = myLooper();
MessageQueue queue = me.mQueue;
while (true) {
Message msg = queue.next();
if (msg != null) {
if (msg.target == null) {
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(); 方法里面是一个while(true)的死循环,一直在遍历消息队列
queue.next()
这是一个阻塞式的方法, 底层用到了java的管道流机制, 当队列中有消息的时候该方法就会执行, 没消息,就阻塞.
MessageQueue
- 消息队列
未完待续 …