Android Handler 问题

1. 一个线程有几个handler

    一个线程有N 个Handler ,new  几个就可以有几个

2. 一个线程有几个Looper 如何保证?

    一个线程只有一个 looper ,通过ThreadLocal是否存在looper,若不存在 通过 threadLocal 的 set() new Looper. 若存在,抛异常 

3.Handler 内存泄漏

new Handler 后,相当于创建了一个内部类,系统会默认 让 Handler 持有 外部类的this对象, 在Activity destory 的时候,jvm 会判断 外部类的this 被内部类持有,不能被释放调。
 

Messgae在加入对列后会持有Handler 的this,然而,handler 做为内部类,又持有外部类的this,当message 需要延时执行时,在队列中等待的时候,外部类的this被销毁了,就产生了内存泄漏。

在handlerMessage 里 可直接调用 Activity 内的方法,说明 handler 默认持有 了 Activity 的 this。

 

4. 主线程为什么能直接 new Handler ? 子线程需要做什么操作?

1). 在ActivityThread 及主线程中,已经调用了,Looper.prepareMainLooper(); 与 Looper.loop();

 

2) 子线程中,使用Handler 需要先调用 Loop.prepare(), 与 Loop.loop().

5.子线程没用消息后,会阻塞在 Looper.loop(),后续代码将不执行,如何释放呢?
   调用 Looper 的 quit()可以释放内存与释放线程

6.多线程与多个Handler 往MessageQueue添加数据, 如何保证线程安全的?
  MessageQueue的 enqueueMessage 的时候,与 next()取消息,有 synchronized ,保证了安全性
  因为保证了线程安全,所以 Handler 的 delay 的 时间 不准确

  

7. Message 如何创建

    Message msg = handler.obtainMessage();
 msg.what = 1;
 handler.sendMessage(msg);

   使用 obtain 会将一个空闲的Message 重置,减少了new Message ,节省了内存

  

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值