程诺陪你学Android

Looper的loop死循环为什么不会阻塞主线程?

2022-01-24  本文已影响0人  GoLearning轻松学

因为主线程的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一直在哪里空转。

上一篇下一篇

猜你喜欢

热点阅读