王辰浩
王辰浩
界面刷新的本质流程 >1. 通过`ViewRootImpl`的`scheduleTraversals()`进行界面的三大流程。 >2. 调用到`scheduleTraversals()`时不会立即执行,而是将该操作保存到`待执行队列`中。并给底层的刷新信号注册监听。 >3. 当`VSYNC`信号到来时,会从`待执行队列`中取出对应的`scheduleTraversals()`操作,并将其加入到`主线程`的`消息队列中`。 >4. `主线程`从`消息队列中`取出并执行`三大流程: onMeasure()-onLayout()-onDraw()` 同步屏障的作用 >1. `同步屏障`用于`阻塞`住所有的`同步消息`(底层VSYNC的回调onVsync方法提交的消息是`异步消息`) >2. 用于保证`界面刷新功能的performTraversals()`的优先执行。 同步屏障的原理? > 1. 主线程的`Looper`会一直循环调用`MessageQueue`的`next`方法并且取出`队列头部的Message`执行,遇到`同步屏障(一种特殊消息)`后会去寻找`异步消息`执行。如果没有找到`异步消息`就会一直阻塞下去,除非将`同步屏障`取出,否则永远不会执行`同步消息`。 > 1. 界面刷新操作是异步消息,具有最高优先级 > 1. 我们发送的消息是同步消息,再多耗时操作也不会影响UI的刷新操作
Java不像C++一样能继承多个类,通过实现多个接口,能实现多继承的效果
使用弱引用是对的,静态内部类也是对的。 **问题2:不使用这些方法,Handler直接持有Activity的引用是否一定会导致内存泄漏?** 1. 如果Handler中没什么耗时操作,任务完成也就释放了Activity引用。 2. 如果Handler中是一个2秒的操作,在Activity退出的2s后,释放了Activity的指针,这种情况属于短时间的内存泄漏? 3. Handler中是啥死循环的话,就内存泄露了。 个人写的Handler,且没有耗时操作。没必要保护。 公司项目对于代码规范的话,还是加上保护比较好。避免后续有同事,加上了耗时操作,出现问题。
1. 点击图标后Launcher进程会通过Binder机制向AMS发起打开Activity的请求【IPC->Binder】 2. AMS会通过ActivityStarter处理Intent和Flag(启动模式相关的内容),然后通过Socket通知zygote进程【IPC->Socket】 3. zygote进程会进行孵化(虚拟机和资源的复制),然后fork出新进程 4. 然后zygote进程会通过invokeDynamicMain()方法调用到ActivityThread的main方法【ActivityThread】 ```java public static void main(String[] args) { // 1. mainLooper Looper.prepareMainLooper(); // 2. 创建ActivityThread,执行attach ActivityThread thread = new ActivityThread(); thread.attach(false); // 3....