您的位置:首页 > 运维架构

Looper的秘密

2016-04-14 17:53 399 查看

还记得这段代码吗

@Override
public void run() {
Looper.prepare();
looper =Looper.myLooper();

Looper.loop();
handler.sendEmptyMessage(3);
}


Looper不是创建对象,而是直接使用的静态方法,我也是醉了,

prepare()

myLooper()

loop()

都是这么来的,起码以前很少见过这么有风格的api

于是我们就产生了疑问

Looper是如何与该程序(线程)交互的?

还好没人告诉我,于是就点开了源码

Looper.myLooper()


接着

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


接着点开get

public T get() {
// Optimized for the fast path.
Thread currentThread = Thread.currentThread();
Values values = values(currentThread);
if (values != null) {
Object[] table = values.table;
int index = hash & values.mask;
if (this.reference == table[index]) {
return (T) table[index + 1];
}
} else {
values = initializeValues(currentThread);
}

return (T) values.getAfterMiss(this);
}


下面这行代码:

Values values = values(currentThread);

我们发现Looper跟当前线程产生了联系,也就是说它是把一些东西存放在了当前线程的某个变量里面,果然

Values values(Thread current) {

return current.localValues;

}

然后在Thread类里面找到了这句代码

ThreadLocal.Values localValues;

当然如果我们从其他return看代码,得到的就是null,要不是

table[index + 1]


table也是从values过来的

说到底,Looper的信息是保存在当前线程的属性里面的,所以才能用静态方法获取looper
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: