因为主线程的Looper实在ActivityThread里面准备出来,创建出来的,那么其实我们Android程序也就是Java程序,
你启动它,进入main方法,执行完所有的方法,也就会退出了,那么我们的应用程序你说总不能说执行完main方法就退出把?
所以肯定是要一个死循环要卡在那里,让我们的这个Android的应用不至于说执行那么一点代码就退出,所以这个在ActivityThread的mian方法里面回去首先准备一个主线的Looper方法,然后准备完了之后中间会有一些其他的内容,最后会有一个Looper.loop()会阻塞在哪里,而为什么我们写的代码不会因为这个looper而死循环呢?因为我们写的代码就是通过handler驱动起来的,我们activity的onCreate、onResume、onStop等等这些生命周期方法,包括我们的UI绘制的信号,这些UI绘制的事件都是通过Handler Looper循环内部发起的,来调用回调我们的各个Activity,各个Fragment等等这样的一些组件里面的各个生命周期方法,我们的代码就是在循环里面执行的,你说怎么会阻塞呢?而且你说死循环会不会导致我们的CPU一直在我们没消息的时候,它死循环会不会一直在那里空转,导致CPU一直帮你做事情,实际上你没有什么事情可做,那么其实这个Looper有一个死循环在使用之外,有一个nativePollOnce的这个方法,这个方法是个native方法,本地方法调用像对应的JNI接口,对应的C/C++方法,这里面其实是我们在Linux里面的一个管道机制,epoll,在没有消息的时候它会wait会进行一个等待,这时候调用完epoll_wait之后,没有消息的时候,它就会等待在那里,实际上调用完wait之后,就会释放我们的CPU,就等于我们的应用在休眠状态,它不会让CPU一直在哪里空转。
Thread的run方法如下:
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
=
代码Looper.loop()是一个for死循环,然后突然想到主线程中也有Looper为什么不卡主线程于是找到了ActivityThread的源码
public static void main(String[] args) {
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(); throw new RuntimeException(“Main thread loop unexpectedly exited”);
}
main方法的退出就是Looper.loop();的执行完毕,所有事件都是Looper的监听,主线程本事就是个阻塞。
Android是事件驱动,Looper内部是一个while死循华,只有程序退出后循环才会停止,如果Looper使用中死掉了,任何事件都不会有反应了。事件只会阻塞Looper,而Looper不会阻塞事件。