美文网首页Android实用技术Android开发经验谈
日更(十九)-Android-Looper怎么和Handler关

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

作者: Jlanglang | 来源:发表于2019-01-19 22:59 被阅读61次

    瞎扯

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

    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思想,语法,设计.

    相关文章

      网友评论

        本文标题:日更(十九)-Android-Looper怎么和Handler关

        本文链接:https://www.haomeiwen.com/subject/nrktjqtx.html