Android - 如何保证一个线程一个Looper?

ThreadLocal

1. Looper的获取

Looper的构造方法私有,只能通过静态方法获取。

static final ThreadLocal sThreadLocal = new ThreadLocal();

public static @Nullable Looper myLooper() {
    return sThreadLocal.get();
}

注意sThreadLocal,他在Looper.java类中是static final修饰,表示不变且唯一。

2. 通过ThreadLocal来get
public T get() {
    Thread t = Thread.currentThread(); // 获取当前线程
    ThreadLocalMap map = getMap(t); // 获取当前线程对应的map
    if (map != null) {
        ThreadLocalMap.Entry e = map.getEntry(this); // 通过this(ThreadLocal)拿到map中的entry
        if (e != null) {
            @SuppressWarnings("unchecked")
            T result = (T)e.value; // 拿到entry中的value,即Looper
            return result;
        }
    }
    return setInitialValue();
}

说明一下,ThreadLocalMap是ThreadLocal的内部类,里面维护一个Entry数组,每个Entry是一个key、value的形式,key是ThreadLocal,value是Looper。

3. 论证

一个线程对应一个map ----->
map中以key、value形式保存数据 ----->
key是ThreadLocal本身 ---->
Looper的获取是通过静态方法获取 ---->
而Looper中的ThreadLocal唯一且不变 ---->
所以Looper唯一。

最简单的话说就是在同一个线程内,map唯一,key唯一,value肯定唯一。

你可能感兴趣的:(Android - 如何保证一个线程一个Looper?)