Looper源码中
1. prepare方法:目的是用户创建Looper对象.
public static void prepare() {
prepare(true);
}
private static void prepare(boolean quitAllowed) {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper(quitAllowed));
}
2, loop()方法: 用于在某个线程中启用一个循环来给handler发消息.
msg.target即为handler对象.
public static void loop() {
...................
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}
...................
try {
msg.target.dispatchMessage(msg);
end = (slowDispatchThresholdMs == 0) ? 0 : SystemClock.uptimeMillis();
} finally {
if (traceTag != 0) {
Trace.traceEnd(traceTag);
}
}
}
3,对于android中mainlooper,就是在ActivityThread.java中main()函数中进行创建以及启动looper,代码如下:
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
// End of event ActivityThreadMain.
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Looper.loop();
从Looper类中的实现,可以看出调用了loop()后,最后为什么要quit()来结束loop.
那么怎么可以结束呢?看源码知,只有当msg为null的时候会结束for循环,即loop结束.
有同学可能会认为当handler不发消息的时候,loop就自动停止了,答案是NO.
4,接下来观察MessageQueue中next()的实现:
也是一个for循环, 我们查找return语句.
Message next() {
for (;;) {
// Process the quit message now that all pending messages have been handled.
if (mQuitting) {
dispose();
return null;//关键点,只有当这个为null的时候,上面loop方法会结束for循环.
}
}
}
其中mQuitting是由loop的quit方法传值.
// from Looper类 public void quit() { mQueue.quit(false); }
这就是整个消息loop机制原理.
大家可以分析下IntentService以及其中使用的HandlerThread,原理一样的.
有问题,大家可以留言交流...