因为主线程的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一直在哪里空转。
Looper的loop死循环为什么不会阻塞主线程?
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 其实这里的原因,主要是因为MessageQueue底层采用了epoll进行阻塞,当接收到消息的时候会唤醒主线程。我...
- 标题是伪命题 参考资料 Android中为什么主线程不会因为Looper.loop()里的死循环卡死? 知乎之前...
- (1) Android中为什么主线程不会因为Looper.loop()里的死循环卡死? 先说说说进程/线程,进程:...
- 本文来自于知乎,原文连接如下: Android中为什么主线程不会因为Looper.loop()里的死循环卡死? 著...
- 1 阻塞主线程 当主线程调用了Looper.loop()方法时候,就开始监听消息。此时会调用queue.next(...