Handler 理解记录

目录

问题

1、一个线程有几个handler

2、一个线程有几个looper?如何保证?

3、handler内存泄漏的原因,为什么其他内部类不会出现这个问题

4、子线程中 new handler()之前要做些什么准备

5、子线程中维护的looper,当消息队列无消息的处理方案,有什么用?

6、既然可以存在多个handler往MessageQueue中添加数据(发消息时可以处于不同的线程)那他的内部是如何保证线程安全的

7、我么使用 Message该如何创建

8、Looper.loop()死循环为什么不会出现anr



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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值