2018-08-27

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引用变为弱引用。

你可能感兴趣的:(2018-08-27)