标签:源码分析清除筛选

Handler 运行流程源码解析(八):为什么主线程的 Looper 死循环不会卡死应用(ANR)

主线程最终进入 Looper.loop ,正常运行时这个方法不会返回。既然线程一直停留在循环中,Activity 生命周期、点击事件和界面刷新为什么还能执行? 关键在于:这些工作本来就由事件循环驱动。 主线程不需要先退出 loop 才能执行回调;回调就在循环处理事件的过程中被调用。空闲时,循环又会进入可唤醒的阻塞等待,避免持续空转。 一、先区分无限循环、忙等、死锁和 ANR 几个词经常被混用

Handler 运行流程源码解析(五):quit() & quitSafely()

本文根据视频《子线程中维护的 Looper 在无消息的时候应该怎么处理减少性能问题》整理。 子线程调用 Looper.loop 后,即使没有消息,方法也不会自动返回。看到这里的无限循环,很容易产生两个疑问:它会不会一直占用 CPU?如果不再使用这条线程,又该怎样让它结束? 这两个问题需要分开回答:暂时没有消息时,Looper 会阻塞等待,不需要额外加休眠;业务不再需要这条消息线程时,应主动调用

Handler 运行流程源码解析(四):子线程中如何new Handler

本文根据视频《为何主线程可以new Handler,子线程中如何new Handler》整理。 一、为什么换一个线程,new Handler 就报错? 在主线程的 Activity.onCreate 中,下面这行代码通常可以正常执行: 把它放到一个普通子线程里,就可能得到这样的异常: 关键在于无参构造会查找当前线程的 Looper。Android 框架已经为应用主线程准备好了 Looper,而

Handler 运行流程源码解析(三):从引用链看 Handler 内存泄漏

本文内容整理自享学团队直播课《Handler 运行流程源码解析(三)》 一、先说结论:Handler 本身不会自动导致内存泄漏 “Handler 为什么会导致内存泄漏?”这个问题,常见回答是“生命周期不一致”或“内部类持有外部类”。这两句话都触及了现象,却没有解释完整。 真正决定对象能否被回收的,是它是否仍能从 GC Root 到达。以 Activity 中的非静态内部类 Handler 为例,只

Handler 运行流程源码解析(二):一个线程有几个 Handler 和几个 Looper?

本文内容整理自享学团队直播课《Handler 运行流程源码解析(二)》 一、一个线程只有一个 Handler? "一个线程有几个 Handler、几个 Looper"这个问题,最常见的答法是两个都答 1。前半个答案是错的,而且很容易当场验证:在一个 Activity 里 new Handler(Looper.getMainLooper ),在同一个 App 的 Service 里再 new 一个

App 启动流程源码分析(五):Application 启动阶段与启动框架设计

本文内容整理自享学团队直播课《App 启动流程源码分析(五)》 一、从启动屏动画到 Application 有一个很容易复现的现象:给 Application.onCreate 的头尾各打一个 Trace.beginSection / endSection,测出来只有 30ms;但用 adb shell am start -W 量整体,接入几个三方 SDK 前后 TotalTime 涨了一百多毫秒

App 启动流程源码分析(四):黑白屏原因与优化方向

本文内容整理自享学团队直播课《App 启动流程源码分析(四)》 一、App启动性能标准设定 点击桌面图标,屏幕立刻被一整块纯白(或纯黑)铺满,几百毫秒后才切成 App 的真实界面。可以通过在冷启动过程中执行 adb shell dumpsys window windows grep -i starting进行流程观测,通过上述命令能看到一个类型为 TYPEAPPLICATIONSTARTING

App 启动流程源码分析(三):启动耗时分析 — WMS 方向

本文内容整理自享学团队直播课《App 启动流程源码分析(三)》 一、从 WMS 方向看启动,问题落在哪里 冷启动的耗时账单最后要落到"首帧什么时候上屏",这条线的终点在 WMS 一侧。但往回追一步就会撞上一个不太好回答的地方:进程创建完成、ApplicationThread 回连 AMS 之后,AMS 在同一段加锁逻辑里干了两件事——把 Application 的信息发过去,以及把 Activit