Android是不断读取消息队列中的消息并处理消息来保证应用程序的运行,调用Looper.loop()方法会循环调用消息队列messageQueue.next()方法来读取消息,当messageQueue中没有消息时主线程会阻塞在message.next()内部的messageQueue.nativePollOnce()函数调用中,类似于Object.wait(),但会让出cpu执行权,让cpu休眠直到下次有消息进入。android系统是linux内核,使用的pipe/epoll机制,通过在pipe管道中写读数据来唤醒主线程,依靠文件描述符的读写状态变化来唤起读写操作,具体实现是调用messageQueue.enqueueMessage()在队列中加入消息的时候内部会调用nativeWeak()方法来唤醒,类似于Object.notify()操作。所以说大多数情况下主线程都是处于休眠状态的,并不会因为loop造成ANR.
网友评论