Android开发为什么主线程可以一直运行而不会退出来
Android开发为什么主线程可以一直运行而不会退出来
-
App启动后系统通过反射实例化ActivityThread类,并调用main方法,主线程入口:
main方法里调用了我们熟悉的Looper的prepare方法,然后调用loop方法进入死循环状态,所以主线程不会退出,退出就异常了。。。
public static void main(String[] args) { //... Looper.prepareMainLooper();//调用主线程的Loop的prepare方法 //... Looper.loop(); //进入循环loop状态 throw new RuntimeException("Main thread loop unexpectedly exited"); }
-
为什么主线程进入死循环loop状态,主线程没有卡顿?
由于主线程启动后,就会进入死循环状态,所以所有和主线程打交道的必须通过主线程的handler,而主线程进入死循环了为什么没有卡住呢?这个问题就涉及到MessageQueue的消息队列的存取问题了,以及native epoll机制。消息队列为空时,主线程会进入等等状态(nativePollOnce),当有新消息入队列时,epoll机制会通过nativeWake方法唤醒主线程,所以主线程不会主卡也不会一直耗时,因为没消息处理了就会进入等待休眠状态,这就是epoll机制的好处。
//MessageQueue的两个方法 Message next() { nativePollOnce(ptr, nextPollTimeoutMillis); } boolean enqueueMessage(Message msg, long when) { nativeWake(mPtr); }
分类:
android系统源码分析
标签:
Android源码解读
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库