Looper:
如下两个方法都是系统调用的 先是调用了prepareMainLooper() 然后调用loop()
prepareMainLooper() 主线程中创建的 安卓环境调用的
prepare(boolean quitAllowed) 创建了一个线程安全的对象
在该对象的内部 创建一个名叫mQueue的MessageQueue对象
sMainLooper = myLooper();
该myLooper()就是从主线程中提取的当前的Looper对象
loop()
等.....
Handler:
1.在主线程中new出来的对象
Handler()
Handler(Callback callback, boolean async)
mLooper = Looper.myLooper();
拿到当前主线程的Looper对象
mQueue = mLooper.mQueue;
拿到Looper的mQueue 作为自己的mQueue
2.在子线程中调用了sendMessage(msg);
sendMessageDelayed(msg, 0);
sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis)//queue就是Looper的mQueue,而Message就是我们发送信息携带的Message
msg.target = this;//Message携带了一个target属性 它指向当前的Handler对象
return queue.enqueueMessage(msg, uptimeMillis);
MessageQueue:
enqueueMessage(msg, uptimeMillis);
Message p = mMessages;//在MeessageQueue里面有一个mMessages的全局变量
if (p == null || when == 0 || when < p.when) {//如果该全局变量是空的 说明我们第一次存Message
// New head, wake up the event queue if blocked.
msg.next = null;//将我们传进来的Message的下一个指向为null
mMessages = msg;//就将我们传进来的对象设置为mMessages
needWake = mBlocked;
} else {
// 如果我们之前已经发送了Message了(并且还没来得及处理)
Message prev;
for (;;) {
prev = p;//拿到全局变量 将当前需要发送的Meesage存储最后那个Message的next属性里
p = p.next;
if (p == null || when < p.when) {
break;
}
if (needWake && p.isAsynchronous()) {
needWake = false;
}
}
msg.next = p; // invariant: p == prev.next
prev.next = msg;
}
// We can assume mPtr != 0 because mQuitting is false.
if (needWake) {
nativeWake(mPtr);
}
}
-----------------------------------------sendMessage() 将信息传递到主线程的Looper对象的MessageQueue中-----------------------------------------------------
-----------------------------------------上面的分析中我们压根没处理信息 信息是如何被handleMessage()调用-----------------------------------------------------
Looper:
如下两个方法都是系统调用的 先是调用了prepareMainLooper() 然后调用loop()
prepareMainLooper() ....
loop()
final Looper me = myLooper(); //1.拿到主线程Looper对象
final MessageQueue queue = me.mQueue;//2.拿到自己的MessageQueue对象
for (;;) { //3.这里是个死循环 说明系统一直在跑这段代码
Message msg = queue.next(); //4.取出需要处理的信息
try {
//5.msg.target=拿到当初发送该信息的Handler 然后调用Handler的dispatchMessage
msg.target.dispatchMessage(msg);
} finally {
if (traceTag != 0) {
Trace.traceEnd(traceTag);
}
}
msg.recycleUnchecked();
}
Handler:
dispatchMessage(Message msg)
handleMessage(msg);