美文网首页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关

    瞎扯 昨天说今天写这个,今天就写这个周六还上班,唉 Looper创建的时候做了什么事 说起这个,在android源...

  • Android-Looper ,Handler ,Message

    1. Handler Looper MessageQueue 模型 Handler 提供sendMessage方...

  • android异步消息处理机制

    Handler问题 1,什么是handler handler通过发送和处理Message和Runnable对象来关...

  • Android部分Handler机制篇

    1、什么是 Handler? Handler是异步机制。通过发送和处理Message和Runnable对象来关...

  • 今天还作打油诗

    日更又到四十七, 今天还作打油诗。 还有三天满五十, 关健时刻别大意。 曾经在不知规则的情况下,不经意日更了十九天...

  • 日更十九

    8、势可得而我勤之,此重得也;势不可得而我勤之,此重失也。 根据形势可以得到的东西我努力争取,就可以获得重大成功;...

  • 日更十九

    推荐给大家一部高分韩国犯罪电影 《毒战》

  • 日更十九

    今天太阳特别大,昨晚看天气预报,说有台风,没想到台风对这不敏感。 天气依然很干燥。最近,就吃土豆上火了。可能放油有...

  • 日更十九

    今天是个特别的日子:我中午要结束流浪生涯了。 早上可以说是早早出门,折腾了一上午,下午又去了一趟才搞定。也许是在外...

  • 日更十九

    二月份有几个保险都需要续保了,保险代理人年外已经第二次微信上联系我关于保险的事宜。 年里店面搬了之后,生意上有较大...

网友评论

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

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