Android实用技术Android开发经验谈

日更(十九)-Android-Looper怎么和Handler关

2019-01-19  本文已影响61人  Jlanglang

瞎扯

昨天说今天写这个,今天就写这个
周六还上班,唉

Looper创建的时候做了什么事

说起这个,在android源码中,有个很常见的写法

就是


image.png

静态常量.

随着类的加载而创建.全局唯一,单例.

这个对象只会有一个.因为是静态的.理解这个.后面就好懂了.

这个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));

image.png image.png

也就是说每个线程,都会有一个ThreadLocalMap集合对象

然后呢,不同的线程就会有不同的ThreadLocalMap

然后Looper中把唯一的ThreadLocal对象做为Key.不同的Looper对象做为Value.
保存在每个线程的map中.

这样.我们的Looper和线程就关联起来了.


然后怎么获取Looper呢?

image.png image.png

handler是怎么拿到Looper的?

昨天说的,是不是很奇怪,handler没有任何的绑定looper代码.
就和looper建立关系了..

看图:

image.png

因为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?

上篇其实提了.
就是


image.png

handler在sendmsg的时候,会把自己与message绑定起来.

然后Loop里面

image.png

在通过这个target.拿到handler.处理消息.

总结

整个handler,Looper.基本就这么回事了

其核心呢,其实是线程的这个方法.


可以在一个线程内的任何地方,通过整个静态方法,拿到这个线程的引用.
这个方法是最关键的,没有这个整个设计都无法实现.
其原理,大致也就是解决了this跨域.


我记得2年前,我也懵逼,不爱看这些源码.英文看不懂.名字又难记.
有些内容,直接跳过,找关键的地方看就完了.理解了作者的设计想法.也就差不多了.

看习惯就好了.也就那么回事.离不开基础的java思想,语法,设计.

上一篇 下一篇

猜你喜欢

热点阅读