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
相关文章推荐
- Zookeeper的数据模型、节点、角色
- shell 中 &&和||的方法
- Linux PS 详解
- SoC嵌入式软件架构设计之七:嵌入式文件系统设计
- Linux中madplay 音乐播放器移植步骤(在ubuntu中编译)
- Tomcat性能优化及JVM内存工作原理
- docker host OS 和 the container base image OS 之间的关系
- 常用的github网站的第三方
- linux系统安装nginx
- Targets may link only to libraries. CMake is dropping the item.
- Web网站压力测试工具
- zabbix自动发现硬盘并监控其IO
- Linux 第八周实验 进程的切换和系统的一般执行过程
- 【centos】安装ELK之ElasticSearch
- 80端口一直被占用,导致resin或者tomcat运行不了
- Linux 命令神器:lsof 入门
- Zookeeper的安装和配置(集群模式)
- SVN: an error occurred and the operation could not be completed
- shell--条件测试语句和流程控制语句的使用
- [Ora]-1309. OCI is not properly installed on this machine (NOE1/INIT)