目录
3、handler内存泄漏的原因,为什么其他内部类不会出现这个问题
5、子线程中维护的looper,当消息队列无消息的处理方案,有什么用?
6、既然可以存在多个handler往MessageQueue中添加数据(发消息时可以处于不同的线程)那他的内部是如何保证线程安全的
handler机制
问题
1、一个线程有几个handler
handler通过 new创建 handler对象,对象多少取决于new的个数
2、一个线程有几个looper?如何保证?
一个线程有一个looper
每当执行 looper.prepare()会判断 ThreadLocal.get()
Looper 类中会定义 final ThreadLocal属性 ThreadLocal唯一
ThreadLocal 类中有维护一个内部 ThreadLocalmap类
ThreadLocalmap 的key为线程
value为 创建的 looper
根据 ThreadLocalmap的key可以知道一个线程只有一个looper
3、handler内存泄漏的原因,为什么其他内部类不会出现这个问题
handler 实现时 匿名内部类会持有this 的引用,handler.enqueueMessage(msg)时会使的msg.target持有handler对象。
当内部类的生面周期不在大于外部类的生面周期就会出出现这个问题
(静态内部类 弱引用 有生面周期的外部类)
4、子线程中 new handler()之前要做些什么准备
子线程中 需要执行 looper.prepare()和 looper.loop()
主线程中 在 ActivityThread 的main时已经执行了 looper.mainprepare()和 looper.loop()
5、子线程中维护的looper,当消息队列无消息的处理方案,有什么用?
调用looper.quit()
执行 nativewake 唤醒线程
结束looper.loop中的死循环
6、既然可以存在多个handler往MessageQueue中添加数据(发消息时可以处于不同的线程)那他的内部是如何保证线程安全的
每个 looper中 消息队列 MessageQueue 是唯一的
当执行 MessageQueue.enqeueMessage()会使用synchronized 同步锁,执行next时 同样会 synchronized,这样就可以确保线程的安全
7、我么使用 Message该如何创建
1、可以new message
2、复用 message.obtain()
避免 内存抖动 引起oom
消息在 msg.target.dispatchMessage 后会执行recycleUnchecked 将 message的数据清空
message.next 维护队列
8、Looper.loop()死循环为什么不会出现anr
anr 是 封装的 handler消息
本身是需要 通过Looper.loop()来处理的
anr 是与Looper.loop()死循环不相关联的功能
//
备注:抓日志 adb bugreport