android handle的一些面试问题整理

本文探讨了线程中的Handler数量、Looper单例机制、内存泄漏原因、主线程与子线程Handler创建、消息队列空处理、线程安全实现及多Handler协作。特别关注了如何避免Handler内存泄漏和保证线程一致性。
摘要由CSDN通过智能技术生成

1.一个线程里有几个handler?
答:初始化多少就有多少个(可以是n个)
2.一个线程里面有多少Looper?如何保证?
答:一个线程里面只有一个Looper;因为Looper里面使用了ThreadLocal(相当于一个map,只不过是上下层存储的,第一层存当前线程,第二层存looper),通过ThreadLocal.get()判断了存在就不进行添加了,否则就就调用ThreadLocal.set(当前线程,初始化的looper)添加,所以保证了一个线程里只有一个looper
3.Handler内存泄漏的原因?为什么其他内部类不存在这种问题?
答:内部类持有了外部类的引用;因为MessageQueue里面的message持有了handler内
部又持有了当前activity,所以有时activity可能销毁而messageQueue还在调用
4.为何主线程可以new Handler?子线程中new handler需要怎么处理?
答:因为整个app都是运行在主线程的,主线程中已经初始化一个Looper了;获取主线程的looper就可以在子线程中new handler了(getMainLooper方法)
5.子线程中维护的looper,消息队列无消息时处理方案是什么?有什么用?
答:消息队列无消息时处理方案是调用Looper.quitSafely()方法;释放资源,释放线程
6.既然可以存在多个handler往MessageQueue中添加数据(发消息时各个Handler可能处 于不同的线程),那它内部是如何确保线程安全的?
答:因为存数据和取数据时都用了锁(synchronized),但是虽然保证了安全,也会导致 发送时间上存在误差

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值