瞎扯
昨天说今天写这个,今天就写这个
周六还上班,唉
Looper创建的时候做了什么事
说起这个,在android源码中,有个很常见的写法
就是

静态常量.
随着类的加载而创建.全局唯一,单例.
这个对象只会有一个.因为是静态的.理解这个.后面就好懂了.
这个ThreadLocal是什么
先看创建Looper实例的代码.
private static void prepare(boolean quitAllowed) {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper(quitAllowed));
}
可以看到,调用这个方法后,刚刚说的那个静态常量.调用了
sThreadLocal.set(new Looper(quitAllowed));


也就是说每个线程,都会有一个ThreadLocalMap
集合对象
然后呢,不同的线程就会有不同的ThreadLocalMap
然后Looper中把唯一的ThreadLocal
对象做为Key.不同的Looper
对象做为Value.
保存在每个线程的map中.
这样.我们的Looper和线程就关联起来了.
然后怎么获取Looper呢?


handler是怎么拿到Looper的?
昨天说的,是不是很奇怪,handler没有任何的绑定looper代码.
就和looper建立关系了..
看图:

因为Looper和线程绑定了.
所以只要是在线程内.就能通过Looper.myLoop()
很轻易的获得这个线程绑定的Looper对象.
new Thread() {
@Override
public void run() {
super.run();
Looper.prepare();
Handler handler = new Handler();
Looper.loop();
}
}.start();
因为Handler handler = new Handler();
这段代码是运行在这个线程内的.
所以Handler可以通过Looper.myLoop()
这个静态方法就能拿到具体的Looper对象.
Looper怎么拿到handler?
上篇其实提了.
就是

handler在sendmsg的时候,会把自己与message绑定起来.
然后Loop里面

在通过这个target.拿到handler.处理消息.
总结
整个handler,Looper.基本就这么回事了
其核心呢,其实是线程的这个方法.

可以在一个线程内的任何地方,通过整个静态方法,拿到这个线程的引用.
这个方法是最关键的,没有这个整个设计都无法实现.
其原理,大致也就是解决了this跨域.
我记得2年前,我也懵逼,不爱看这些源码.英文看不懂.名字又难记.
有些内容,直接跳过,找关键的地方看就完了.理解了作者的设计想法.也就差不多了.
看习惯就好了.也就那么回事.离不开基础的java思想,语法,设计.
网友评论