Handler,Looper,Messagequeue,message学习笔记
Handler作为android线程间通信的一种重要方式,在android开发中具有重要地位.
创建Handler过程中,Handler调用Looper,myLooper();获取存放于threadlocal中的looper实例,已做到绑定Looper。
public Handler(Callback callback, boolean async) {
if (FIND_POTENTIAL_LEAKS) {
final Class klass = getClass();
if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
(klass.getModifiers() & Modifier.STATIC) ==0) {
Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
klass.getCanonicalName());
}
}
mLooper = Looper.myLooper();
if (mLooper ==null) {
throw new RuntimeException(
"Can't create handler inside thread that has not called Looper.prepare()");
}
mQueue =mLooper.mQueue;
mCallback = callback;
mAsynchronous = async;
}
Looper创建过程中,Looper.prepare()会检查线程ThreadLocal是否已存在Looper,存在则抛出异常,是以Looper.prepare()不可重复调用,Looper.prepare()d 创建Looper实例并将其放入线程threadLocal,Looper构造函数创建messageQueue并持有,并持有当前线程对象。
Looper.loop(),获取Looper所持有的messageQueue对象,并以一个死循环不断从中取消息,所以子线程使用Handler,调用Looper.loop()后,后续代码不会执行。
MessageQueue 先进先出队列,其数据结构是单向的链表,其节点为Message。
Message,消息载体,通过target字段持有Handler引用,handler作为内部类又持有activity引用,所以,当activity退出message未执行完,会导致内存泄漏,解决方法,activity退出清除所有message,将handler作为静态内部类,重写其构造,使handler持有的activity引用变为弱引用。