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 ,节省了内存