Handler源码解析1
https://blog.csdn.net/qq_44076155/article/details/110676740
Handler源码解析2
https://blog.csdn.net/qq_44076155/article/details/110687066
享元设计模式
内存复用,使用同一块内存空间,bitmap,recycleView都有使用这种思想
在loop从消息队列中取出消息并分发完后,并不会把消息对象销毁,而是通过msg.recycleUnchecked()方法清空消息放入消息池进行回收
这样做可以避免反复创建和销毁msg对象,造成内存抖动和oom
创建消息的时候使用obtain方法从内存中取,不用反复申请内存空间
同步屏障
可以屏蔽同步消息,来优先执行系统中重要的异步消息
命中if后,进入循环过滤掉同步消息,而msg.target=null 的时候该消息就是一个同步屏障
例如屏幕刷新,ANR通知等重要消息就可以优先通过这种方式执行
HandlerThread
HandlerThread是Thread的子类,严格意义上来说就是一个线程,只是它在自己的线程里面帮我们创建了Looper
HandlerThread 存在的意义如下:
1) 方便使用:a. 方便初始化,b,方便获取线程looper
2)保证了线程安全
我们在子线程中使用Looper需要通过 Looper.prepare() Looper.loop()两个步骤,而且还不能保证线程安全
看看handlerThread中的处理
在run方法里面为我们封装好了这两个方法
两个方法加了隐式锁
1.可以有无数个
2.一个,通过threadLocal来保证
3.内部类持有外部类的对象,而生命周期不一致。具体是msg.target持有了handler对象,而handler对象持有了外部类的activity对象,当activity销毁时,msg没有销毁导致的内存泄漏
4.mlooper.prepare 和 mlooper.loop
5.调用quit,结束loop循环
6.synchronized锁
7. obtain
8.ANR是事件5s为响应,而looper休眠时因为没得事件执行,两者并没有关联