天天看点

为什么Looper死循环不阻塞主线程

Looper用一个死循环for( ;  ; )不停地从MessageQueue中取出消息然后交给相应的Handler去处理,直到你主动调用quit()或别的方法将这个循环跳出,但为什么主线程却没有被阻塞呢?这是因为主线程本来就是跑在一个这样的循环里,伪代码是这样的:

..... main (... )
       {
    	   Looper.prepare();//主线程跑起来了
    	   ... ... ... 
    	   Looper.loop();//开启死循环了
       }
           

看到没,其实主线程本身就是一个死循环,当这个死循环停止,app也就退出了。可以这样认为:

你在app里所用的操作,比如点击按钮、点击返回键、HOME键等,还有发出一个广播,收到一个广播这种非界面相关的,都是事件(当做Message),主线程就是一直在处理这些Message才使得app动了起来。如果恰巧没有事件了呢?主线程不就阻塞了?不就ANR了吗?这还不好说!?会不会ANR还不是主线程(或者说android自身)说了算。

最后一句话总结:主线程一直没死,就是因为一直有其他模块发出的、我们看不到的Message放进主线程的MessageQueue,主线程一直在忙着处理这些Message。