Android Handler 问题

1. 一个线程有几个handler

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

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

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

Android Handler 问题

3.Handler 内存泄漏

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

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

Android Handler 问题

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

 

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

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

Android Handler 问题

 

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

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

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

  

Android Handler 问题

Android Handler 问题

7. Message 如何创建

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

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

  

Android Handler 问题